как переставить блоки текстового файла по столбцам

#linux #bash #for-loop #awk

#linux #bash #for-цикл #awk

Вопрос:

Эксперты Hii еще одна проблема, с которой я обычно сталкиваюсь при перестановке моего текстового файла.

мой текстовый файл устроен так, как написано ниже.

 >
1
2
3
>
2
3
4
>
1
4
5 
 

Но мне нужно переставить приведенный выше файл, перенеся последний блок в первый столбец, перед последним блоком во второй столбец и т. Д., Как указано ниже: кто-нибудь может предложить лучшее решение для того же.Заранее спасибо.

 1 2 1
4 3 2
5 4 3
 

Ответ №1:

 $ cat tst.awk
/^>/ {
    numRows = 0
      numCols
    next
}
{ vals[  numRows,numCols] = $1 }
END {
    for (rowNr=1; rowNr<=numRows; rowNr  ) {
        for (colNr=numCols; colNr>0; colNr--) {
            printf "%s%s", vals[rowNr,colNr], (colNr>1 ? OFS : ORS)
        }
    }
}
 
 $ awk -f tst.awk file
1 2 1
4 3 2
5 4 3
 

РЕДАКТИРОВАТЬ: чтобы создать сценарий оболочки, выполните описанные выше действия, сохраните это в файле с именем foo :

 #!/usr/bin/env bash

awk '
    /^>/ {
        numRows = 0
          numCols
        next
    }
    { vals[  numRows,numCols] = $1 }
    END {
        for (rowNr=1; rowNr<=numRows; rowNr  ) {
            for (colNr=numCols; colNr>0; colNr--) {
                printf "%s%s", vals[rowNr,colNr], (colNr>1 ? OFS : ORS)
            }
        }
    }
' "${@:--}"
 

а затем запустите его как foo file .

Комментарии:

1. можем ли мы включить файл awk -f tst.awk в скрипт, чтобы требовалось только изменение входного файла.

2. Это команда оболочки, поэтому вы можете включить ее в сценарий оболочки, но тогда вы действительно просто будете писать awk 'script' "${@:--}" в сценарии оболочки, а не иметь еще один файл, содержащий сценарий awk.