Как напечатать имя файла в awk? - PullRequest
2 голосов
/ 14 октября 2019

Я хотел бы напечатать имя файла, а затем значение $ 7 в цикле. Что не так, пожалуйста? с '"i"'

for i in r*; do
    awk 'FNR == 2 {print '"i"', $7}' r* > out
done

ВЫВОД после извещения

fdfadfasdfa     0.00775                 0.00644                 6298
dsafdsfsaf      0.00705                 0.00574                 14173
dasfdsafdafd        0.00716                 0.00597                 22948
dafadsafdafsdf      0.00859                 0.00679                 5210
dafadsfsa       0.00705                 0.00576                 11098

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Не могли бы вы попробовать следующее. Вам не нужно использовать цикл for.

awk 'BEGIN{OFS="\t\t"} FNR==2{print FILENAME, $7}' r*  | column -t > out

В случае, если у вас есть GNU awk, вы можете использовать nextfile, чтобы сохранить много циклов и сразу перейти к следующему файлу, когда условие выполнено следующим образом:

awk 'BEGIN{OFS="\t\t"} FNR==2{print FILENAME, $7; nextfile}' r*  | column -t > out

Чтобы установить \t\t в качестве разделителя табуляции для выхода, установите OFS в секции BEGIN. Добавьте | column -t в выходной файл, чтобы получить правильный формат TAB.

Удалите BEGIN{OFS="\t\t"}, если это НЕ требуется, поскольку добавлена ​​команда column (OP запросил TAB в выходных данных, чтобы его добавили для него).

2 голосов
/ 14 октября 2019

Поскольку вы полагаетесь на bash для поставки $i, вам необходимо включить знак доллара. Также одинарные и двойные кавычки должны быть поменяны местами. Awk должен видеть двойные кавычки, поэтому они должны находиться внутри одинарных кавычек.

for i in r*; do
    awk 'FNR == 2 {print "'$i'", $7}' r* > out
done

Обратите внимание, что это небезопасно, если $i может содержать специальные символы. Лучше не расширять переменные bash непосредственно внутри скриптов awk. Вы получаете проблемы с цитированием, проблемы с пробелами;это бомба замедленного действия.

Лучше использовать -v для передачи переменных bash в awk. Это безопаснее и позволяет избежать проблем с цитированием и экранированием при загрузке. Вы можете просто написать i, просто так.

for i in r*; do
    awk -v i="$i" 'FNR == 2 {print i, $7}' r* > out
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...