ProgramingTip

AWK를 사용하여 여러 파일의 입력 처리

bestdevel 2020. 12. 25. 10:29
반응형

AWK를 사용하여 여러 파일의 입력 처리


많은 사람들이 한 번에 여러 입력 파일을 AWK하기위한 다음 솔루션을 게시하여 매우 도움이되었습니다.

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1

이것은 잘 작동하지만 누군가가 이유를 설명해 줄 수 있는지 궁금합니다. 나는 AWK 구문이 익숙해지기가 조금 힘들고 누군가가 나를 위해 코드 스 니펫을 분해하는 것을 신경 쓰지 않기를 바라고 있었다.


awk 'FNR==NR{a[$1]=$2 FS $3;next}

여기서 우리는 첫 번째 입력 (file2)을 처리합니다. 파일, FS 공간이, 우리는 (배열을 구축 ) a, 지수 값은, 1 열입니다 , 코드 의이 부분은 파일 2 만 작동을 의미합니다. NR과 FNR이 무엇인지 확인하실 수 있습니다.column2 " " column3FNR==NR and next

{ print $0, a[$1]}' file2 file1

NR != FNR-th 입력 입력을 두 처리 때가 되면 파일 1. 여기서 우리는 file1의 줄을 인쇄하고 칼럼 1을 고급로 취하고 배열 (a) print에서 값을 찾습니다. 즉, file1과 file2는 두 파일에서 column1로 결합됩니다.

NR 및 FNR의 경우 곧

1st input has 5 lines
2nd input has 10 lines,

NR would be 1,2,3...15
FNR would be 1...5 then 1...10

은 당신 FNR==NR수표 의 속임수를 본다 .


Google 에서이 질문 / 답변을 찾았으며 다른 질문 ( AWK를 사용하여 두 파일을 병합하는 방법? ) 에서 매우 구체적인 데이터 세트를 참조하는 추천 시청 . 다음은 내가 찾던 (그리고 대부분의 사람들이 그렇게 될 생각) 대답입니다. 즉, AWK를 사용하여 두 개의 서로 다른 파일에서 모든 줄을 연결하는 것입니다. 가입 또는 붙여 넣기 와 같은 일부 UNIX 유틸리티를 사용할 수 있지만 , AWK를는 경우을 사용 하거나 OFS를 변경 하여 원하는 출력이 다른 경우 훨씬 더 유연하고 강력합니다 (유틸리티에 따라 수행하기 더 어려울 수 있음 ). 예를 들어, 훨씬 더 표현적인 방식으로 출력을 변경합니다 (셸 스크립터에게 중요한 고려 사항).

간단한 줄 단위 연결의 경우 :

awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""], $0 }' file1 file2

이는 암시 적 형식 변환을 사용하여 숫자 배열 배열 (AWK에만 연관 배열이 있음)의 기능을 에뮬레이트합니다. 최선을 다하고 있습니다.

다음 줄에 test1 및 test2라는 두 파일 사용 :

test1 :

line one
line two
line three

test2 :

line four
line five
line six

이 결과를 얻습니다.

line one line four
line two line five
line three line six

출력에서 열 사이의 값을 조인하려는 방법에 따라 적절한 출력 필드 구분 기호를 선택할 수 있습니다. 다음은 열을 구분하는 줄임표 (...)가있는 예입니다.

awk 'BEGIN { OFS="..."} FNR==NR { a[(FNR"")] = $0; next } { print a[(FNR"")], $0 }' test1 test2

이 결과를 다수 :

line one...line four
line two...line five
line three...line six

여러분 모두가 AWK의 힘을 활용하도록 영감을주기를 바랍니다!


얼마 전에 여러 파일을 한 번에 처리 할 수있는 아주 좋은 솔루션을 발견했습니다. 방법은 다음 방법을 사용하여 AWK 배열의 파일을 메모리에 저장하는 것입니다.

FILENAME==ARGV[1] {  file2array[FNR] = $0 ; next }
FILENAME==ARGV[2] {  file1array[FNR] = $0 ; next }

사후 데이터 처리의 경우 줄 수를 저장하는 것이 좋습니다.

FILENAME==ARGV[1] {  file2array[FNR] = $0 ; f2rows = FNR ; next }
FILENAME==ARGV[2] {  file1array[FNR] = $0 ; f1rows = FNR ; next }

f2rows그리고 f1rows마지막 행의 위치를 ​​개최한다.

더 많은 코드가 더 복잡한 데이터 처리를 원하면 더 나은 접근 방식이라고 생각합니다. 모든 이전 접근 방식은 입력을 사용하여 처리가 수행 한 두 파일의 데이터에 동시에 수행하는 일부 계산을 수행해야하는 경우 접근 방식을 사용하면 두 파일에서 모든 작업을 수행 할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/14984340/using-awk-to-process-input-from-multiple-files

반응형