파일 열 값을 통해 명령을 반복하는 방법은 무엇입니까?

파일 열 값을 통해 명령을 반복하는 방법은 무엇입니까?

이런 간단한 명령이 있어요

 grep 'X' results.dat | awk '{print $NF}'  > Y.dat

이 명령을 반복하고 싶습니다엑스~에서열 1그리고 그에 상응하는~에서2열같은 파일의예를 들어. 이름

NAMES 파일 형식은 다음과 같습니다.

C11-C12     p01
C13-C14-C17 P02
etc ..

따라서 루프의 처음 두 단계는 다음과 같아야 합니다.

grep 'C11-C12' results.dat | awk '{print $NF}'  > p01.dat
grep 'C13-C14-C17' results.dat | awk '{print $NF}'  > p02.dat

답변1

셸에서 반복이 필요하지 않은 솔루션:

awk 'pass==1 {  Xpatt[NR] = $1; Yfile[NR] = $2 ".dat"; printf "" > Yfile[NR] }
     pass==2 {
                for (i in Xpatt) {
                        if ($0 ~ Xpatt[i]) print $NF > Yfile[i]
                }
             }' pass=1 NAMES pass=2 results.dat
  • 첫째, awk를 사용하는 대신 파일 이름과 혼합하여 프로그램 뒤에 명령줄 인수로 변수 할당을 지정할 수 있습니다 -v. 이러한 변수는 명령줄에서의 위치에 따라 제안되는 처리 순서의 지점에서 실행됩니다. 따라서 위의 명령에서

    1. pass1로 설정,
    2. 파일이 NAMES처리되었습니다.
    3. pass2로 설정한 다음
    4. 파일이 results.dat처리되었습니다.

    pass=1-v블록에서 a 또는 set을 사용할 수 있다고 생각합니다 BEGIN.

    변수를 사용하여 pass내가 읽고 있는 파일이 무엇인지 알려줍니다. 이는 일반적 NR으로 와 비교하여 수행되지만 FNR파일이 비어 있으면 오류 표시가 발생할 수 있습니다.

    (엄밀히 말하면 이 스크립트는 두 파일이 모두 비어 있는지 확인해야 한다고 생각합니다. 이 경우에는 수행할 작업이 없기 때문입니다.)

  • (파일을 읽는 동안 ) pass==1파일의 1열과 2열(and) NAMES에 X 및 Y 값(패턴 및 파일 이름)을 저장합니다. 출력 파일( )을 생성합니다. 여기서 이 작업을 수행하지 않으면 파일에 존재하지 않는 패턴에 대한 (빈) 출력 파일을 얻을 수 없기 때문입니다. (동의하신다면 이 문장은 생략해주세요.)$1$2Yfile[NR]results.datprintf
  • pass==2(파일을 읽는 동안 results.dat) 파일의 패턴을 반복 NAMES하고 패턴과 일치하는 각 줄의 마지막 단어를 해당 파일에 인쇄합니다. 즉, OP grep X … | awk '{print $NF}' > Y.dat명령과 동일합니다.

답변2

쿵쿵거리는 솔루션:

while read X Y remainder || [[ -n ${Y} ]]; do
    awk -v X="$X" '$0 ~ $X {print $NF}' results.dat > "$Y".dat
done < NAMES
  • 일반적으로 while IFS="q" read X Y remainder; do ...; done < NAMES의 행은 에서 반복됩니다 NAMES. IFS(내부 필드 구분자) 값을 기준으로 각 행의 값을 구분 합니다 . 이 예에서는 IFSletter 로 설정합니다 q. IFS기본값은 공백(공백 문자, 탭 문자 또는 개행 문자)입니다. 첫 번째 필드는 변수에 할당되고 X두 번째 필드는 에 할당되며 Y나머지 줄은 에 할당됩니다 remainder.

    또한보십시오:파일의 열을 별도의 변수로 읽어옵니다.(유닉스.SE).

    위의 솔루션에는 IFS사양이 없습니다.생각하다입력란이 이미 공백으로 구분되어 있습니다.

    참고: 파일의 필드에 백슬래시가 포함된 경우 백슬래시가 이스케이프 시퀀스로 해석되지 않도록 NAMES을 사용해야 합니다 .read -rread

  • ... remainder || [[ -n ${remainder} ]]섹션에서는 두 가지 작업을 처리합니다. 추가 필드(있는 경우)는 에 저장되고 remainder입력 파일의 마지막 줄이 개행으로 끝나지 않는 경우 \n( readEOF가 발생할 때 0이 아닌 종료 코드 반환)를 처리합니다.

    또한보십시오:파일을 한 줄씩 읽고 변수에 값을 할당합니다.(그래서).

  • grep완전 제거: awk -v X="$X" '$0 ~ $X {print $NF}' results.dat > "$Y".dat-v옵션은 awk스크립트에서 사용할 수 있는 변수를 정의합니다 awk.

관련 정보