用特定行的awk替换多个列

时间:2014-02-25 15:45:18

标签: unix replace awk

我想用a.com的第3列,第4列和第5列替换b.com的第6列,第7列和第8列以获取特定行。

awk 'NR==FNR{a[NR]=$6;next}FNR>5&&FNR<5287{$3=a[FNR]}1' b.com a.com

- 一次只能替换一列。我可以修改此命令,以便它将替换所有三列吗?

例如: -

a.com:

a b 1 2 3 4
c d 3 2 1 4

b.com:

a d e f k 3 4 5 l
p q w e g 5 4 3 m

期望的输出:

a b 3 4 5 4
c d 5 4 3 4

2 个答案:

答案 0 :(得分:2)

awk 'NR==FNR {fld6[NR]=$6; fld7[NR]=$7; fld8[NR]=$8; next}
FNR>5 && FNR<5287 {$3=fld6[FNR]; $4=fld7[FNR]; $5=fld8[FNR]}1' b.com a.com

<强>逻辑:

  • 将您需要的列从b.com存储到以行号
  • 索引的数组中
  • a.com中达到相似的行后,您可以通过引用该数组替换b.com中的列。
  • FNR>5 && FNR<5287这是为了修改这些特定的行。对于每一行,您都可以删除此

<强>测试

$ cat a.com 
a b 1 2 3 4
c d 3 2 1 4

$ cat b.com 
a d e f k 3 4 5 l
p q w e g 5 4 3 m

$ awk 'NR==FNR {fld6[NR]=$6; fld7[NR]=$7; fld8[NR]=$8; next}
{$3=fld6[FNR]; $4=fld7[FNR]; $5=fld8[FNR]}1' b.com a.com
a b 3 4 5 4
c d 5 4 3 4

答案 1 :(得分:0)

我首先使用paste然后使用awk。

paste a.com b.com > c.com

此命令将a.com和b.com作为相邻列放在新文件中。

然后到awk部分,

awk '{print $3,$4,$5,$10,$11,$12}' c.com

(你必须根据a.com中实际有多少列来清理它

作为一个命令

paste a.com b.com | awk '{print $3,$4,$5,$10,$11,$12}'

编辑:如果OP只需要特定的行(行),这可能不起作用