输入文件:
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最近开始支持文件内替换。但是根据您的要求,最好使用sedKent 在上面发布的解决方案。$ 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