【问题标题】:replacing multiple columns with awk for specific lines用 awk 替换特定行的多列
【发布时间】:2014-03-27 23:18:58
【问题描述】:

我想将 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

【问题讨论】:

  • 您能提供一些示例输入和输出吗?

标签: unix replace awk


【解决方案1】:
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&gt;5 &amp;&amp; FNR&lt;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

【讨论】:

    【解决方案2】:

    我会先使用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 只需要特定的行(行),这可能不起作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2018-12-17
      相关资源
      最近更新 更多