Печатать наборы строк из нескольких папок в виде строк, а не столбцов?

#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 значениям в концах выходных записей.