편집하다

편집하다

열 수가 다르고 행 수가 많은 두 개의 파일이 있습니다.

bash-3.00$ cat fileA 
a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,

PS1: a1 - a9는 쉼표(,)로 구분된 헤더입니다. PS2: 마침표(.)는 두 줄 사이에 여러 줄이 있음을 나타냅니다.

bash-3.00$ cat fileB 
b1      b2
f       t
a       p
m       n
..........      
m       y
t       o

추신: b1 - b2는 헤더이며 공백으로 구분됩니다.

fileA의 a2 및 a6 열을 b1 및 b2 열의 내용에 추가하고 싶습니다. 즉, 열 a2는 열 b1에 추가되고 열 a6은 열 b2에 추가됩니다.

따라서 출력 파일은 다음과 같습니다.

bash-3.00$ cat output 
a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................       
z,p,,,,w,e,,
,f,,,,t,,,
,a,,,,p,,,
,m,,,,n,,,
.........................
,m,,,,y,,,
,t,,,,o,,,

간단한 awk 명령으로 이 작업을 어떻게 수행할 수 있나요?

답변1

원하는 것은 i) file1의 내용을 file2에 추가하고 ii) file2의 형식을 파일 1의 형식과 일치하도록 변경하는 것입니다. 이것은 귀하의 질문이 실제로 요구하는 것이 아니라 결과에 표시되는 것입니다. 제가 오해한 경우 질문을 수정하고 명확하게 설명해주세요.

이를 수행하려면 다음을 수행하면 됩니다.

awk 'NR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file2 >> file1 

file1그러면 출력 파일이 생성됩니다 . 이를 유지하려면 file1다음과 같이 하십시오.

( cat file1; awk 'NR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file2 ) > out

또는 모든 작업을 수행할 수도 있습니다 awk(이는 Archemar 솔루션의 단순화된 버전일 뿐입니다).

awk 'NR==FNR{print; next} FNR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file1 file2 > out

답변2

노력하다

awk 'FNR == NR { print ; next ; } 
     NR > FNR && FNR > 1 { 
          split($0,A) ; 
          printf ",%s,,,,%s,,,\n",A[1],A[2] ;  }' f1 f2 

(한 줄로 작성해도 되지만 읽기 쉽도록 나누었습니다.)

어디

  • FNR == NR { print ; next ; } 첫 번째 파일에서 줄 복사
  • NR > FNR && FNR > 1두 번째 파일에서 헤더가 없는 행 선택
  • split($0,A) ; 두 개의 변수를 배열에 넣습니다( A).
  • printf ",%s,,,,%s,,,\n",A[1],A[2] ;인쇄하고

편집하다

f1으로 테스트

a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,

그리고 f2

b1  b2
f   t
a   p
m   n
m   y
t   o

달리기:

awk 'FNR == NR { print ; next ; } NR > FNR && FNR> 1 { split($0,A) ; printf ",%s,,,,%s,,,\n",A[1],A[2] ;  }' f1 f2

결과:

a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,
,f,,,,t,,,
,a,,,,p,,,
,m,,,,n,,,
,m,,,,y,,,
,t,,,,o,,,

관련 정보