while 루프에서 awk를 작동시키는 방법

while 루프에서 awk를 작동시키는 방법
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를 사용하고 있습니다.

답변1

입력 파일을 읽기 명령으로 파이프하면 종종 재난이 발생하며 어떤 경우에는 작동하지만 많은 경우에는 작동하지 않습니다. 이를 수행하는 보다 일관된 방법을 배우는 것이 좋습니다.

다음은 몇 가지 간단한 대안입니다...

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 등과 같은 텍스트/토큰 기반 스크립트 언어를 덜 사용하는 것이 좋습니다.

관련 정보