이전 명령의 출력을 다음 명령으로 전달합니다.

이전 명령의 출력을 다음 명령으로 전달합니다.

아래에는 최종 출력을 정렬된 파일로 생성하는 두 개의 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"대신 이 명령을 사용하여 유틸리티가 셸 대신 출력 파일을 생성하도록 할 수도 있습니다(미묘한 차이).sortsort


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.xargssort콘텐츠파일 이름 대신 파일 이름이 인수로 전달됩니다. 이것은 당신이 원하는 것이 아닙니다. (당신은 cutas의 출력을 전달 하고 싶습니다.데이터입력하다 sort).

관련 정보