![공통 열로 두 파일 결합](https://linux55.com/image/167894/%EA%B3%B5%ED%86%B5%20%EC%97%B4%EB%A1%9C%20%EB%91%90%20%ED%8C%8C%EC%9D%BC%20%EA%B2%B0%ED%95%A9.png)
두 개의 파일이 있습니다. 첫 번째는,
a 0.1 c t 0.4
c 0.25 g a 0.1
d 0.567 c c 0.00004
q 0.76 f c 0.05
두 번째는,
a hello
c goodbye
d morning
q hungry
다음과 같이 파일을 만들고 싶습니다.
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
어떻게 해야 하나요?
답변1
이 시도,
파일이 정렬되어 있으므로 join
다음 명령을 직접 사용할 수 있습니다.
join Second First | cut -f2- -d' '
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
정렬되지 않은 경우 다음 코드를 사용하십시오.
join <(sort second) <(sort first) | cut -f2- -d' '
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
답변2
awk
첫 번째 열만 사용하도록 두 번째 파일을 처리한 다음 첫 번째 파일을 사용하여 채우는 방식은 매우 간단합니다 .
awk 'FNR == NR { map[$1] = $2; next } ($1 in map) { $1 = map[$1] }1 ' second first
답변3
또 다른 join
방법은 조인의 내장 기능을 사용하는 것입니다.
$ join -o 2.2,1.2,1.3,1.4,1.5 <(sort file1) <(sort file2)
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05
-o
출력 형식을 지정할 수 있습니다 . 여기서는 join
파일 2( )의 두 번째 필드를 사용한 2.2
다음 파일 1( )의 첫 번째, 두 번째, 세 번째, 네 번째 및 다섯 번째 필드를 사용하도록 지시합니다 1.2,1.3,1.4,1.5
.
답변4
페이스트를 사용하세요.
paste <(cut -d ' ' -f2- file2) <(cut -d ' ' -f2- file1)
쉘을 사용하십시오.
while IFS= read -r file2 <&3; do
IFS= read -r file1
printf '%s %s\n' "${file2##* }" "${file1#* }"
done 3<file2 <file1
지침
둘 다 정렬되지 않았으며 대용량 파일/데이터가 관련되면 쉘이 느려집니다.
들여쓰기 없이 서식을 직접 붙여넣습니다.