【问题标题】:Cat headers and renaming a column header using awk?Cat 标题并使用 awk 重命名列标题?
【发布时间】:2015-05-04 13:27:22
【问题描述】:

我有一个像这样的输入文件 (input.txt):

name value1 value2
A 3 1
B 7 4
C 2 9
E 5 2

还有一个包含名称列表的文件 (names.txt),如下所示:

B
C

使用 grep -f,我可以得到所有名称为“B”和“C”的行

grep -wFf names.txt input.txt

得到

B 7 4
C 2 9

但是,我想将标题保留在输出文件的顶部,并将列名“name”重命名为“ID”。并使用 grep 保留名称为 B 和 C 的行,输出应为:

**ID** value1 value2
B 7 4
C 2 9

我认为 awk 应该能够做到这一点,但作为 awk 的新手,我不知道如何处理这个问题。感谢您的帮助!

【问题讨论】:

    标签: linux bash shell awk


    【解决方案1】:

    虽然在 awk 中当然可以做到这一点,但解决实际问题的最快方法是在 grep 输出前面添加您想要的标题。

    echo **ID** value1 value2 > Output.txt && grep -wFf names.txt input.txt >> Output.txt
    

    更新由于OP有多个文件,我们可以修改上面的行,将第一行从输入文件中拉出来。

    head -n 1 input.txt | sed 's/name/ID/' > Output.txt && grep -wFf names.txt input.txt >> Output.txt
    

    【讨论】:

    • 谢谢。它适用于一个文件,但我有很多文件;每个文件的列名 value1 和 value2 都不同,所以我不能真的只是预先定义一个预定义的标题..
    【解决方案2】:

    这里是使用awk的方法

    awk 'FNR==NR {a[$1];next} FNR==1 {$1="ID";print} {for (i in a) if ($1==i) print}' name input
    ID value1 value2
    B 7 4
    C 2 9
    

    names存储在数组a
    然后测试归档#1,如果它包含数组a中的数据

    【讨论】:

      猜你喜欢
      • 2016-07-28
      • 2018-12-26
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多