输入文件:
ID,Name,Values
1,A,vA|A2
2,B,VB
预期输出:
1,A,vA|VA2|vA3
2,B,VB
搜索给定 ID 的文件,然后在值 {field} 中附加给定值
用例:将“testvalue”附加到 ID = 1 的值字段
问题是:如何缓存找到的行?
sed
'ss
可以用来替代,我用sed
的是's p
{print but of no use}。
只需设置n
为要更新的行的 ID 和x
值:
# vA3 to entry with ID==1
$ awk -F, '$1==n{$0=$0"|"x}1' n=1 x="vA3" file
ID,Name,Values
1,A,vA|A2|vA3
2,B,VB
# TEST_VALUE to entry with ID==2
$ awk -F, '$1==x{$0=$0"|"v}1' x=2 v="TEST_VALUE" file
ID,Name,Values
1,A,vA|A2
2,B,VB|TEST_VALUE
解释:
-F,
将字段分隔符设置为逗号。$1==x
检查我们正在查看的行是否包含我们要更改的 ID。$1
每行的第一个字段在哪里,x
是我们定义的变量。{$0=$0"|"v}
其中$0
包含整行的变量,所以我们只是将字符串"|"
和变量的值附加v
到行尾。1
只是awk
说打印行的快捷方式。这1
是被评估为 true 的块的条件,并且由于没有提供块,因此awk
执行默认块{print $0}
。明确的脚本将是awk -F, '$1==n{$0=$0"|"x}{print $0}' n=1 x="vA3" file
.以下脚本正在执行与您的需要类似的操作。它是纯的bash
。
#!/usr/bin/bash
[ $# -ne 2 ] && echo "Arg missing" && exit 1;
while read l; do
[ ${l%%,*} == "$1" ] && l="$l|$2"
echo $l
done <infile
你可以使用 as script <ID> <VALUE>
。例子:
$ ./script 1 va3
ID,Name,Values
1,A,vA|A2|va3
2,B,VB
$ cat infile
ID,Name,Values
1,A,vA|A2
2,B,VB
或者可能是这个?
awk '/vA/ { $NF=$NF"|VA2" } 1' FS=, OFS=,
$ echo "1,A,vA
2,B,VB" | awk '/vA/ { $NF=$NF"|VA2" } 1' FS=, OFS=,
1,A,vA|VA2
2,B,VB
awk
最近开始支持文件内替换。但是根据您的要求,最好使用sed
Kent 在上面发布的解决方案。$ cat file
ID,Name,Values
1,A,vA|A2
2,B,VB
$ awk '$1==1 { $NF=$NF"|vA3" } 1' FS=, OFS=, file
ID,Name,Values
1,A,vA|A2|vA3
2,B,VB
你在找这个吗?
kent$ echo "1,A,vA
2,B,VB"|sed '/vA/s/$/|VA2/'
1,A,vA|VA2
2,B,VB
编辑检查ID,然后替换
kent$ echo "ID,Name,Values
1,A,vA|A2
2,B,VB"|sed 's/^1,.*/&|vA3/'
ID,Name,Values
1,A,vA|A2|vA3
2,B,VB
&
表示匹配的部分。这就是你的意思“缓存”
sed ' 1 a\ |VA2|vA3 ' file1.txt