使用sed或awk修改满足两个条件的文件中的行

时间:2013-12-28 19:40:24

标签: regex sed awk

我正在尝试删除文件中符合两个特定条件的行的最后5个字符。该行必须以字母E开头,第二列数据必须等于数字2。 示例如下所示:

原材料:

E1234B123 1 4 12345A 12345 123.4
E1234B123 2 4 12345A 12345 123.4
E1234B123 3 4 12345A 12345 123.4
E1234B123 4 4 12345A 12345 123.4
C1234B123 2 4 12345A 12345 123.4

应该最终成为:

E1234B123 1 4 12345A 12345 123.4
E1234B123 2 4 12345A 12345
E1234B123 3 4 12345A 12345 123.4
E1234B123 4 4 12345A 12345 123.4
C1234B123 2 4 12345A 12345 123.4

我相信这可以用awk和sed完成,但我还没有掌握它们。谢谢您的帮助。

3 个答案:

答案 0 :(得分:1)

你可以试试这个:

awk '{if ((substr($1,0,1)~"E") && (substr($2,0,1)~"2")) for (i=1;i<NF-1;i++) printf("%s ", $i)} END {  printf("\n")}'

答案 1 :(得分:1)

awk '{ if ($1 ~ "^E" && $2 =="2") $(NF--)="";print}' data

这将删除最后一列,而不是5个字符

awk '{ if ($1 ~ "^E" && $2 =="2") print substr($0,0,length($0)-5); else print}' data

这会删除5个字符。

或perl:

perl -ne 'if (/^E.*\s2\s.*/){ print substr($_,0,-6)."\n" } else {print}' data

答案 2 :(得分:1)

awk应该:

awk '/^E/ && $2=="2" {$0=substr($0,1,length($0)-5)}1' file
E1234B123 1 4 12345A 12345 123.4
E1234B123 2 4 12345A 12345
E1234B123 3 4 12345A 12345 123.4
E1234B123 4 4 12345A 12345 123.4
C1234B123 2 4 12345A 12345 123.4

搜索以E开头且第二个字段等于2的行,然后删除最后5个字符。


删除最后一栏:

awk '/^E/ && $2=="2" {NF--}1' file

用空格替换最后5个字符:

awk '/^E/ && $2=="2" {$0=substr($0,1,length($0)-5)"     "}1' file