awk에서 두 파일의 입력을 결합합니다.

awk에서 두 파일의 입력을 결합합니다.

에 대한 내용을 읽었습니다 awk. 단일 데이터에 적합하다는 것이 밝혀졌습니다. 두 개의 입력 파일이 있다고 가정해 보겠습니다.

## inp1
x y
1 3
2 4
6 9
... 

## inp2
x z
1 5
2 19
6 9

"결합된" 두 파일의 내용을 출력하고 싶습니다. 그것은 다음과 같습니다:

## output
x y z
1 3 5
2 4 19
6 9 9

이 두 파일을 다음과 같이 인터리브하는 아이디어를 생각해 볼 수 있습니다.https://stackoverflow.com/questions/4011814/how-to-interleave-lines-from-two-text-files그리고 awk로 몇 가지 작업을 수행하세요.

아니면 연관 배열을 사용하는 뭔가가 있을까요? 하지만 그것이 문제의 원인인지는 확실하지 않습니다. ;)

저는 리눅스를 사용하고 있습니다.

답변1

join첫 번째 필드에서 파일을 결합하려는 것 같습니다 .

$ join -j1 file1 file2 
x y z
1 3 5
2 4 19
6 9 9

입력이 정렬될 것으로 예상 되므로 join다음을 수행해야 할 수도 있습니다.

$ join -j1 <(sort file1) <(sort file2 )
1 3 5
2 4 19
6 9 9
x y z

그러나 이렇게 하면 헤더가 엉망이 되므로 이를 방지하려면 다음과 같이 하십시오.

$ join -j1 <(head -n1 file1) <(head -n2 file2); join -j1 <(tail -n+2 file1|sort) <(tail -n+2 file2 |sort )
x y z
1 3 5
2 4 19
6 9 9

새 파일에 저장합니다.

( \
    join -j1 <(head -n1 file1) <(head -n2 file2); 
    join -j1 <(tail -n+2 file1|sort) <(tail -n+2 file2 |sort ) \
) > newFile

또는 다음을 사용하십시오 awk.

$ awk 'NR==FNR{a[$1]=$2; next}{print $1,$2,a[$1]}' file2 file1 
x y z
1 3 5
2 4 19
6 9 9

답변2

제공한 예제 입력을 사용하여 필드가 탭으로 구분된 경우 필요한 것은 다음과 같습니다.

$ paste file1 <(cut -f2 file2)
x   y   z
1   3   5
2   4   19
6   9   9

또는 공백으로 구분된 경우:

$ paste -d' ' file1 <(cut -d' ' -f2 file2)
x y z
1 3 5
2 4 19
6 9 9

답변3

사용 awk:

  • 방법 1
    awk 'FNR==NR{a[FNR]=$2;next}{print $1,a[FNR],$2}' f1 f2
    
  • 방법 2
    awk 'NR==FNR{a[$1];a[FNR]=$2;next}($1 in a) {print $1,a[FNR],$2}' f1 f2
    

산출

x y z
1 3 5
2 4 19
6 9 9

관련 정보