1

输入文件:

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}。

4

5 回答 5

2

只需设置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.
于 2013-05-24T13:48:30.543 回答
2

以下脚本正在执行与您的需要类似的操作。它是纯的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
于 2013-05-24T14:23:36.620 回答
1

或者可能是这个?

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

编辑 1: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
于 2013-05-24T13:18:27.830 回答
1

你在找这个吗?

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

&表示匹配的部分。这就是你的意思“缓存”

于 2013-05-24T12:54:57.950 回答
0

sed ' 1 a\ |VA2|vA3 ' file1.txt

于 2013-05-25T12:37:35.173 回答