아래에는 최종 출력을 정렬된 파일로 생성하는 두 개의 for 루프가 있지만 하나의 for 루프로 병합하고 싶습니다.
for i in *.txt; do
cut -f 5,10 $i >$i.txt.out
done
###sorting
for i in *.txt.out; do
sort -k1,1 $i >$i.sort
done
파이프를 사용하여 첫 번째 for 루프의 출력을 리디렉션하여 두 루프를 하나로 병합해 보았습니다. 이 게시물의 방법 중 하나를 시도했습니다(이전 명령의 출력을 다음 명령의 인수로 전달합니다.) 그러나 원하는 결과를 얻을 수 없습니다.
for i in *.txt; do
cut -f 5,10 $i >$i.txt.out | xargs -I{} sort -k1,1 {} >$i.sort
done
어떤 제안이 있으십니까?
감사해요
론
답변1
for name in *.txt; do
cut -f 5,10 -- "$name" | sort -k 1,1 >"$name.sort"
done
이는 중간 파일의 사용을 제거하면서 두 개의 초기 루프의 효과를 결합합니다.
나는 몇 가지 작은 수정을 했습니다:
- 모든 변수의 확장을 의미합니다.언제 큰따옴표가 필요합니까?
- 루프 변수에 더 나은 이름을 사용하십시오.
- 파일 이름이 대시로 시작하는 경우
cut
명령에서 변수를 분리하여--
옵션의 끝을 나타냅니다.$name
위의 명령 sort -k 1,1 -o "$name.sort"
대신 이 명령을 사용하여 유틸리티가 셸 대신 출력 파일을 생성하도록 할 수도 있습니다(미묘한 차이).sort
sort
이 xargs
유틸리티는 자주 사용됩니다.바꾸다루프:
printf '%s\n' *.txt | xargs -I {} sh -c 'cut -f 5,10 -- "$1" | sort -k 1,1 >"$1.sort"' sh "{}"
...하지만 여기서는 상황이 더 복잡해집니다(위 명령은 개행 문자가 포함된 파일 이름에 문제가 있습니다).
주문
cut -f 5,10 $i >$i.txt.out | xargs -I{} sort -k1,1 {} >$i.sort
cut
출력을 실행 하고 $i.txt.out
(확장됨 $i
)에 저장합니다. xargs
출력이 cut
파일로 리디렉션되므로 명령이 입력되지 않습니다. 출력을 리디렉션하지 않은 경우 다음을 사용 합니다 cut
.xargs
sort
콘텐츠파일 이름 대신 파일 이름이 인수로 전달됩니다. 이것은 당신이 원하는 것이 아닙니다. (당신은 cut
as의 출력을 전달 하고 싶습니다.데이터입력하다 sort
).