다음과 같이 탭으로 구분된 값을 가진 두 개의 파일이 있습니다.
파일 1:
A 1
B 3
C 1
D 4
파일 2:
E 1
B 3
C 2
A 9
열 1에 동일한 문자열이 있는 파일 1과 파일 2 사이의 행을 찾은 다음 해당 값을 얻고 싶습니다. 원하는 출력은 다음과 같은 단일 파일입니다.
B 3 3
C 1 2
A 1 9
Unix one-liner로 이것이 가능합니까?
답변1
join
결과의 줄 순서가 관련이 없는 경우 GNU coreutils에는 필요한 작업을 정확하게 수행하는 명령이 포함되어 있습니다.
join <(sort file1) <(sort file2)
A 1 9
B 3 3
C 1 2
탭을 복원하려면 다음을 수행하십시오.
join <(sort file1) <(sort file2) | tr ' ' '\t'
A 1 9
B 3 3
C 1 2
또는 t
옵션을 사용하세요 join
.
( <()
일명 프로세스 교체, ksh93(이 기능의 출처), bash 또는 zsh 필요)
답변2
ire@localhost: sort -k1 file2 | join file1 -
A 1 9
B 3 3
C 1 2
출력에 탭 문자를 사용하려면 다음을 수행하십시오.
sort -k1 file2 | join -t " " file1 -
CTRL-V 를 눌러 따옴표 안에 탭을 만들 수 있습니다 <tab>
.
답변3
awk는 출력을 정렬하지 않고 file2와 동일한 순서로 정렬하려는 경우 좋은 도구입니다.
awk '
NR == FNR {val[$1]=$2; next}
$1 in val {print $1, val[$1], $2}
' file1 file2