#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.