1

我有如下行的文件:

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
4

4 回答 4

2

您的 sed 表达式试图匹配两个冒号“:.*:”,因此它不适用于最后一个元素。如果您知道您的元素是数字,则可以将 sed 表达式更改为更具体:

s/\(2: [0-9]\+\)/_\1_/g

甚至只匹配除冒号以外的所有内容:

s/\(2: [^:]\+\)/_\1_/g
于 2013-08-27T07:34:55.527 回答
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

于 2013-08-27T07:31:12.760 回答
0

我不确定你想要选择器 xx_3:的方式,但这会打印它后面的数字。

sed 's/.*\(xx_3:.\)\([0-9]*\).*/\2/g' results.txt
于 2013-08-27T07:36:01.403 回答
0

搜索 xx_3,打印下一个字段,退出。没有可以减慢它的循环:

awk '/xx_3/ {f=NR} f&&NR-1==f {print;exit}' RS=" " results.txt
4214

这可用于在搜索命中后打印任何下一个文件。

于 2013-08-27T11:17:09.470 回答