Intereting Posts

Как заставить awk работать в цикле while

input.txt: /usr/dir1/file1 /usr/dir1/file2 /usr/dir2/file4 /usr/dir3/file5 Script: cat input.txt |while read FILENAME do nawk '{print $1}' ${FILENAME} >> output.txt done Expected output: all column1 values of input files Error: nawk: can't open file This works fine when i run it like this nawk '{print $1}' /usr/dir1/file1 >> output.txt nawk '{print $1}' /usr/dir1/file2 >> output.txt nawk '{print $1}' /usr/dir2/file4 >> output.txt 

Я хочу, чтобы иметь возможность запускать его с помощью цикла while или цикла if, скажем, если $? = 0 (с использованием кода возврата). Есть идеи, как это сделать? Я использую solaris 5.10, KSH.

Трубопровод входного файла в команду чтения обычно является рецептом для катастрофы, он может работать в некоторых обстоятельствах, но во многих случаях это не так. Лучше всего выучить более последовательный способ сделать это.

Вот несколько простых альтернатив …

 nawk '{print $1}' $( cat input.txt ) > output.txt 

или если вы хотите его в цикле …

 for FILENAME in $( cat input.txt ); do nawk '{ print $1 }' $FILENAME >> output.txt done 

Преимущество этих подходов заключается в том, что вы также легко меняете фразу

 $( cat input.txt ) 

.. к чему-то, что отбросит комментарии, следуя символу #, который даст вам возможность добавлять комментарии к вашим спискам файлов. например

 $( cat input.txt | sed 's/#.*//' ) 

ПРИМЕЧАНИЕ . Если вам нужно обслуживать пути к файлам, которые содержат пробелы или вкладки, вам, вероятно, нужно будет пропустить bash и использовать менее язык для написания текста / токена, например, perl, python и т. Д.