awk를 사용하여 일치하는 열을 기반으로 두 파일을 병합하고 싶습니다.
b.txt(탭으로 구분)
A
B
C
D
C
C
E
G
a.txt(탭으로 구분)
1 2 2 4 19 A
2 2 3 3 12 B
3 2 9 2 5 C
4 3 8 0 9 D
5 5 4 1 1 E
그런 다음 스크립트를 실행합니다.
awk -F"\t" 'BEGIN{OFS="\t"} {if (NR==FNR) {a[$NF]=$0; next} if ($NF in a) {print a[$1]}}' a.txt b.txt > c.txt
나는 이와 같은 c.txt를 얻습니다.
1 2 2 4 19 A
2 2 3 3 12 B
3 2 9 2 5 C
4 3 8 0 9 D
3 2 9 2 5 C
3 2 9 2 5 C
5 5 4 1 1 E
사실 내가 원하는 결과는
1 2 2 4 19 A
2 2 3 3 12 B
3 2 9 2 5 C
4 3 8 0 9 D
3 2 9 2 5 C
3 2 9 2 5 C
5 5 4 1 1 E
G
또는
A 1 2 2 4 19
B 2 2 3 3 12
C 3 2 9 2 5
D 4 3 8 0 9
C 3 2 9 2 5
C 3 2 9 2 5
E 5 5 4 1 1
G
나에게 어떤 제안이 있나요? 고마워하는!
답변1
몇 가지 조정만 하면 신중한 실험을 통해 원하는 결과를 얻을 수 있습니다. 원하는 첫 번째 결과를 얻으려면
awk -F"\t" '
BEGIN { OFS = FS }
NR == FNR { a[$NF] = $0; pos = NF; next }
{ if ( $NF in a ) { $NF = a[$1]; } else { $pos = $1; $1 = ""; } } 1
' a.txt b.txt
답변2
사용 csvjoin
:
$ csvjoin -H --tabs --left -c 1,6 b.txt a.txt | csvformat -K 1 -T
-H
: 입력 tsv
파일에 헤더 행이 없습니다.
--tsbs
또는 -t
: 입력 파일이 tab
구분됩니다.
--left
완전 외부 조인을 수행합니다.
-c 1,6
첫 번째 파일의 열 1을 두 번째 파일의 열 6과 결합합니다.
csvformat
옵션:
-K 1
명령으로 추가된 첫 번째 헤더 행을 제거합니다 csvjoin
.
-T
구분 기호를 에서 으로 변경 comma
합니다 tab
.