我有两个文件,它们具有不同的列数和大量的行:
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
PS: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 的格式以匹配文件一的格式。这不是您的问题实际要求的,而是您在输出中显示的内容。如果我误解了,请编辑您的问题并澄清。
因此,要做到这一点,您可以简单地执行以下操作:
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) ;
将两个 var 放入一个数组 (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,,,