如何打印所有列,但最后2?

时间:2013-08-21 12:18:12

标签: shell awk

如何打印所有列但是最后2?

e.g

input :echo FB_SYS_0032_I03_LTO3_idaen02r_02_20130820_181008
output : FB_SYS_0032_I03_LTO3_idaen02r_02
delimiter : _ (underscore)

5 个答案:

答案 0 :(得分:4)

对于你的例子,这个awk one liner应该这样做:

awk -F'_' -v OFS='_' 'NF-=2' file

试验:

kent$  awk -F'_' -v OFS='_' 'NF-=2' <<< "FB_SYS_0032_I03_LTO3_idaen02r_02_20130820_181008"
FB_SYS_0032_I03_LTO3_idaen02r_02

答案 1 :(得分:1)

使用此awk命令:

 awk -F "_" '{for (i=1; i<=NF-2; i++) {printf ("%s", $i); if (i<NF-2) printf "_"} print ""}'
 FB_SYS_0032_I03_LTO3_idaen02r_02

答案 2 :(得分:1)

使用sed

sed -r 's/(_[^_]*){2}$//'

例如,

$ echo 1_2_3_4_5 | sed -r 's/(_[^_]*){2}$//'
1_2_3
$ echo 1_2_3_4 | sed -r 's/(_[^_]*){2}$//'
1_2
$ echo FB_SYS_0032_I03_LTO3_idaen02r_02_20130820_181008 | sed -r 's/(_[^_]*){2}$//'
FB_SYS_0032_I03_LTO3_idaen02r_02

答案 3 :(得分:0)

只需使用描述最后两个字段的RE:

awk '{sub(/_[^_]*_[^_]*$/,"")}1'

或:

sed 's/_[^_]*_[^_]*$//'

e.g:

$ echo FB_SYS_0032_I03_LTO3_idaen02r_02_20130820_181008 | awk '{sub(/_[^_]*_[^_]*$/,"")}1'
FB_SYS_0032_I03_LTO3_idaen02r_02

$ echo FB_SYS_0032_I03_LTO3_idaen02r_02_20130820_181008 | sed 's/_[^_]*_[^_]*$//'
FB_SYS_0032_I03_LTO3_idaen02r_02

上面的内容适用于任何现代awk和任何系统上的任何sed。

答案 4 :(得分:0)

可能这是最简单的方法:

$ echo "${input%_*_*}"
FB_SYS_0032_I03_LTO3_idaen02r_02