编辑

编辑

我有两个文件,它们具有不同的列数和大量的行:

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,,,

相关内容