열 수가 다르고 행 수가 많은 두 개의 파일이 있습니다.
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,,,