我有一个像这样的输入文件(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不熟悉我不知道如何处理这个问题。帮助赞赏!
答案 0 :(得分:2)
虽然可以在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
答案 1 :(得分:1)
以下是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