이 스크립트는 다음과 같습니다.
while read ACCT ; do
echo $ACCT
zgrep -h ^$ACCT datafile.0[2-3]2015.gz >>/tmp/$ACCT.txt
done < /account_list.txt
삭제할 때 리디렉션된 출력 파일을 얻지 못하고 '>>/tmp/$ACCT.txt'
출력이 예상되는 stdout으로 이동합니다. 이 예에서 리디렉션된 출력을 얻지 못하는 이유를 이해할 수 없습니다. 나는 또한 대신 zgrep을 시도했습니다 ...
zcat datafile.0[2-3]2015.gz|grep ^$ACCT>>/tmp/$ACCT.txt...
그러나 이것은 어떤 출력도 생성하지 않습니다.
답변1
어떤 데이터가 포함되어 있는지 알지 못한 채 코드 조각을 디버깅하는 것은 어렵습니다. 그래서 나는 ^$ACCT
다른 모든 코드처럼 큰따옴표로 묶어야 한다고 말하는 것 외에는 코드에 어떤 문제가 있을지 추측하지 않을 것입니다 $ACCT
.
zgrep
in의 각 행에 대해 한 번씩 호출하는 대신 account_list.txt
(이러한 데이터 파일은 파일에 있는 행 수만큼 압축이 풀림) in 배열로 계정을 읽어 awk
한 번에 처리합니다.
awk 'NR==FNR { acct[$1]; next }
$1 in acct { file="/tmp/" $1 ".txt"; print >>file; close(file) }' \
account_list.txt <( zcat datafile.0[2-3]2015.gz )
이는 bash
프로세스 대체를 이해하는 다른 쉘을 가정합니다. 또한 계정 목록의 첫 번째 열에 계정 이름이 포함되어 있고 데이터 파일에도 첫 번째 열의 계정 이름이 포함되어 있다고 가정합니다(실제로 해당 파일이 어떻게 보이는지 표시하지 않으므로 이것은 유효합니다).
첫 번째 awk
블록은 첫 번째 파일에 대해서만 실행되며 키로 추출할 계정 이름이 포함된 account_list.txt
연관 배열을 생성합니다 .acct
두 번째 블록은 추출된 데이터 파일의 라인에서만 실행되며, 첫 번째 필드가 의 키에 해당하는 경우 acct
해당 라인은 적절한 이름의 파일에 인쇄됩니다.