1.txt
두 개의 탭으로 구분된 열이 포함된 두 개의 텍스트 파일이 있습니다 2.txt
. 두 파일의 첫 번째 열은 토큰화된 텍스트로 구성됩니다. 두 파일 모두에서 첫 번째 열은 동일합니다. 단어 순서가 중요합니다. 두 번째 열은 레이블로 구성됩니다. 첫 번째 파일에서는 토큰화가 완전하지만 부정확합니다. 두 번째 파일에서는 불완전하지만 정확합니다.
1.txt
:
I 3
was 5
there 6
yesterday 6
. 0
2.txt
:
I 3
was
there 12
yesterday
. 0
각 줄에 레이블이 있도록 (줄의 순서를 유지하면서) 두 파일을 병합하고 싶으므로 2.txt
다음과 같이 보다 정확한 파일(예: file 의 레이블)이 선호됩니다.
I 3
was 5
there 12
yesterday 6
. 0
을 사용해 보았지만 join
두 개의 태그만 표시되거나 한 파일의 태그만 표시됩니다.
$ join 1.txt 2.txt
I 3 3
was 5
there 6 12
yesterday 6
. 0 0
$ join -1 1 -2 1 -o 1.1,2.2 1.txt 2.txt
I 3
was
there 12
yesterday
. 0
이 답변사용하면 awk
비슷해 보이지만 예상한 결과를 제공하지 않습니다. 나는 또한 coreutils를 사용하는 것을 선호합니다.
답변1
사용 awk
:
awk 'NR==FNR{if (NF==2) a[$1]=$2; next}
{print $1,($1 in a ? a[$1] : $2)}' 2.txt 1.txt
NR==FNR
번호 레코드가 파일 번호 레코드와 같은 경우(첫 번째 파일에 있는 경우)a[$1]=$2
첫 번째 필드를 키로 사용하여 두 번째 필드를 배열에 저장합니다.$1 in a ? a[$1] : $2
$1
if는 print의 키 입니다 else printa
a[$1]
$2
답변2
또 다른 옵션은 다음과 같습니다.
join 1.txt 2.txt | awk -e '{if($NF == "") print $1, $(NF - 1); else print $1, $NF}' | column -t
이것은 만든다:
I 3
was 5
there 12
yesterday 6
. 0
이는 | column -t
선택 사항이지만 멋진 열로 형식을 지정하면 됩니다.