에 대한 내용을 읽었습니다 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