我的文件包含如下行:
xx_1: 2414 xx_4: 34214 xx_3: 4214 xx_2: 21421
xx_2: 1212 xx_1: 2424 xx_3: 23213 xx_4: 25214
...
我正在使用此命令获取特定值(例如xx_3的值:来自第一行):
cat results.txt | head -n 1| sed -e 's/[xx_]//g' | sed 's/\(3:.*\):/_\1_/g' | cut -d"_" -f2 | awk '{print $2}'
除非看起来很糟糕,否则它不适用于最后一个元素(如xx_2)。有什么想法吗?
修改
抱歉不精确。调用我的命令给我结果
cat results.txt | head -n 1| sed -e 's/[IT_]//g' | sed 's/\(4:.*\):/_\1_/g' | cut -d"_" -f2 | awk '{print $2}'
34214
cat results.txt | head -n 1| sed -e 's/[IT_]//g' | sed 's/\(1:.*\):/_\1_/g' | cut -d"_" -f2 | awk '{print $2}'
2414
答案 0 :(得分:2)
你的sed表达式试图匹配两个冒号“:。*:”,因此它不适用于最后一个元素。如果您知道您的元素是数字,则可以将sed表达式更改为更具体:
s/\(2: [0-9]\+\)/_\1_/g
甚至只是匹配除冒号之外的所有内容:
s/\(2: [^:]\+\)/_\1_/g
答案 1 :(得分:0)
$ grep -Po 'xx_3: \K[^[:space:]]*' foo.input
4214
23213
$ grep -Po 'xx_2: \K[^[:space:]]*' foo.input
21421
1212
从那里,您可以使用sed
/ awk
来检索特定行,或者如果您只关心第一行,则可以使用head
前面的grep
。< / p>
答案 2 :(得分:0)
我不确定你想要选择器 xx_3:
,但这会打印出它之后的数字。
sed 's/.*\(xx_3:.\)\([0-9]*\).*/\2/g' results.txt
答案 3 :(得分:0)
搜索xx_3,打印下一个字段,退出。没有循环减慢它:
awk '/xx_3/ {f=NR} f&&NR-1==f {print;exit}' RS=" " results.txt
4214
这可以用于在搜索命中后打印任何下一个文件。