我有一个文件,其中包含以下格式的制表符分隔的列
AAA BBB;CCC;DDD;E=10;F=20 GGG
XXX YYY;ZZZ;DDD;E=50;F=40 PPP
我需要使用 UNIX 命令打印值E
(或)。F
10
50
答案1
用于cut
获取第四个字段,然后sed
删除等号之前的所有内容:
cut -f 4 -d\; | sed 's/.*=//'
但是,您提到了制表符分隔的字段,尽管您的示例行用分号分隔字段。
答案2
借助 GNU grep,使用 PCRE ( -P
) 模式:
$ grep -Po '(?<=E=)\d+' file
10
50
或者
$ grep -Po '(?<=F=)\d+' file
20
40
答案3
$ echo 'AAA BBB;CCC;DDD;E=10;F=20 GGG' | awk -F';' '{ print $4 }' | awk -F= '{ print $2 }'
10
$ echo 'XXX YYY;ZZZ;DDD;E=50;F=40 PPP' | awk -F';' '{ print $4 }' | awk -F= '{ print $2 }'
50
或者更简单:
$ echo 'XXX YYY;ZZZ;DDD;E=50;F=40 PPP' | awk 'match($0, /=[0-9]+/) { print substr($0, RSTART + 1, RLENGTH - 1) }'
50
$ echo 'AAA BBB;CCC;DDD;E=10;F=20 GGG' | awk 'match($0, /=[0-9]+/) { print substr($0, RSTART + 1, RLENGTH - 1) }'
10
答案4
如果您不关心该行的其余部分,如果您只想查找它们E=
或F=
它们出现的任何位置,您可以使用sed
:
sed -e 's/.*E=//' -e 's/;.*//'
这将删除“ ”之前的所有内容(包括“ E=
”),然后删除“ ”;
及其后面的所有内容。它假设每一行做包含 ” E=
”。
如果您知道该E=
字段始终出现在特定列中(各列由制表符或分号或其他内容分隔),则最好首先使用cut
或等效项提取该列,然后将E=
部分与值分开。您可以使用sed
@berndbausch 的答案来做到这一点,或者使用cut
假设=
分隔列的第二次调用。