#unix #awk
#unix #awk
Вопрос:
У меня есть файлы .out в нескольких папках.
Допустим, я нахожусь в каталоге, содержащем папки A, B, C, D. Я использую приведенную ниже команду для печати определенного значения из 8-го столбца строк, содержащих ЗНАЧЕНИЕ ключевого слова во всех файлах .out в папках A, B, C, D
awk '/VALUE/{print $8}' ./*/.out
Мой результат будет выглядеть следующим образом:
output1_A
output2_A
output3_A
output1_B
output2_B
output3_B
output1_C
output2_C
output3_C
Есть ли способ, которым я мог бы сделать так, чтобы мои выходные данные выглядели так, как показано ниже?
output1_A output2_A output3_A
output1_B output2_B output3_B
output1_C output2_C output3_C
Другими словами, разделять выходные данные из одной папки пробелом, а не разрывом строки?
Комментарии:
1. Выходные данные представляют собой просто числа, являющиеся частью столбца. Например, из приведенной ниже строки, которая является частью файла большего размера .out, печатный результат будет равен 14566.5
VALUE 1: B= 0.4320 a 1.806 b 14566.5 c
2.
My result would look like:
— нет, это не так. Эти пустые строки не существовали бы.
Ответ №1:
Не могли бы вы, пожалуйста, попробовать следующее (поскольку у меня нет структуры каталогов, поэтому я не мог ее протестировать, или если OP может опубликовать содержимое файла внутри каталога, возможно, мы могли бы сделать это и в самом single awk
).
awk '/VALUE/{print $8}' ./*/.out | xargs -n 3
Комментарии:
1. Это сработало бы только в том случае,
VALUE
если бы в каждом входном файле в каталогах A, B и C всегда было ровно по 1 строке и никогда не существовало в файлах в каталоге D. Трудно представить, что это то, что имеет OP, поскольку, если бы это было так, зачем тогда вообще искать в файлах вD
? Я знаю, что это принятый ответ, но мне интересно, действительно ли OP продумал это и / или протестировал это.
Ответ №2:
Другой:
$ awk '/VALUE/{b=b (FNR==(NR>FNR)?ORS:ofs) $8;ofs=OFS}END{print b}' dir?/file1
output1_A output2_A output3_A
output1_B output2_B output3_B
output1_C output2_C output3_C
Объяснено:
$ awk '
/VALUE/ { # magic keyword
b=b (FNR==(NR>FNR)?ORS:ofs) $8 # gathering a buffer set ORS or OFS appropriately
ofs=OFS # ... but @NR==1 we want ""
}
END {
print b # output buffer
}' dir?/file1
Необъяснимые две пустые записи в вашем примере не рассматриваются, но, вероятно, приведут к дополнительным OFS
значениям в концах выходных записей.