두 개의 개별 파일에서 열 병합


10

awk를 사용하여 두 개의 개별 파일에서 선택적 열을 병합하는 새 파일을 만드는 방법은 무엇입니까? BOTH 파일의 요소 순서를 망치지 않고.

예 : 파일 3에는 파일 1의 열 1,2,3과 파일 2의 열 4가 포함될 수 있습니다.

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5

답변:


4

이 시도:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5

감사! 또한 gawk를 사용하여이 방법을 성공적으로 시도했습니다.pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah

2
@Dovah : paste file1 file2에서 선택한 필드를 사용한 다음 인쇄 할 수 있습니다 awk.
cuonglm

이것은 file2메모리에 저장 되며 파일이 클 경우 금지 될 수 있습니다. 메모리 오버 헤드 없이이 작업을 수행하는 더 간단한 방법이 있습니다 (내 답변 참조).
Gilles 'SO- 악마 그만해'

17

이를위한 전용 도구가 있습니다 : paste. 첫 번째 파일의 각 전체 행을 두 번째 파일의 해당 행과 연결합니다. 이전 또는 이후에 원하지 않는 열을 제거 할 수 있습니다. 예를 들어 열이 탭으로 구분되어 있다고 가정합니다.

paste file1.txt file2.txt | cut -f 1,2,3,6

다음은 ksh / bash / zsh 프로세스 대체에 의존하는 두 파일을 사전 필터링하는 방법입니다.

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

Awk는 주로 한 번에 하나의 파일을 처리하도록 설계되었지만 getline다른 파일에서 병렬로 읽을 수 있습니다 .

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt

지금까지 파일 1의 1 행을 파일 2의 1 행과 일치시키고, 파일 1의 2 행을 파일 2의 2 행과 일치시키고 싶다고 가정했습니다. 열의 내용을 일치 시키려면 완전히 다른 문제. join일치하려는 열이 정렬되어 있으면 작업을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.