이런 간단한 명령이 있어요
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
. 이러한 변수는 명령줄에서의 위치에 따라 제안되는 처리 순서의 지점에서 실행됩니다. 따라서 위의 명령에서pass
1로 설정,- 파일이
NAMES
처리되었습니다. pass
2로 설정한 다음- 파일이
results.dat
처리되었습니다.
pass=1
-v
블록에서 a 또는 set을 사용할 수 있다고 생각합니다BEGIN
.변수를 사용하여
pass
내가 읽고 있는 파일이 무엇인지 알려줍니다. 이는 일반적NR
으로 와 비교하여 수행되지만FNR
파일이 비어 있으면 오류 표시가 발생할 수 있습니다.(엄밀히 말하면 이 스크립트는 두 파일이 모두 비어 있는지 확인해야 한다고 생각합니다. 이 경우에는 수행할 작업이 없기 때문입니다.)
- (파일을 읽는 동안 )
pass==1
파일의 1열과 2열(and)NAMES
에 X 및 Y 값(패턴 및 파일 이름)을 저장합니다. 출력 파일( )을 생성합니다. 여기서 이 작업을 수행하지 않으면 파일에 존재하지 않는 패턴에 대한 (빈) 출력 파일을 얻을 수 없기 때문입니다. (동의하신다면 이 문장은 생략해주세요.)$1
$2
Yfile[NR]
results.dat
printf
pass==2
(파일을 읽는 동안results.dat
) 파일의 패턴을 반복NAMES
하고 패턴과 일치하는 각 줄의 마지막 단어를 해당 파일에 인쇄합니다. 즉, OPgrep 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
(내부 필드 구분자) 값을 기준으로 각 행의 값을 구분 합니다 . 이 예에서는IFS
letter 로 설정합니다q
.IFS
기본값은 공백(공백 문자, 탭 문자 또는 개행 문자)입니다. 첫 번째 필드는 변수에 할당되고X
두 번째 필드는 에 할당되며Y
나머지 줄은 에 할당됩니다remainder
.또한보십시오:파일의 열을 별도의 변수로 읽어옵니다.(유닉스.SE).
위의 솔루션에는
IFS
사양이 없습니다.생각하다입력란이 이미 공백으로 구분되어 있습니다.참고: 파일의 필드에 백슬래시가 포함된 경우 백슬래시가 이스케이프 시퀀스로 해석되지 않도록
NAMES
을 사용해야 합니다 .read -r
read
이
... remainder || [[ -n ${remainder} ]]
섹션에서는 두 가지 작업을 처리합니다. 추가 필드(있는 경우)는 에 저장되고remainder
입력 파일의 마지막 줄이 개행으로 끝나지 않는 경우\n
(read
EOF가 발생할 때 0이 아닌 종료 코드 반환)를 처리합니다.또한보십시오:파일을 한 줄씩 읽고 변수에 값을 할당합니다.(그래서).
grep
완전 제거:awk -v X="$X" '$0 ~ $X {print $NF}' results.dat > "$Y".dat
이-v
옵션은awk
스크립트에서 사용할 수 있는 변수를 정의합니다awk
.