我按以下格式提供数据:
comp.os.linux announce 0000002587 02190 m
comp.arch 00000 28874 y
utsa.cs.3423 00000000004 000000000001 y
我应该处理它,看起来像:
comp.os.linux announce m
comp.arch y
utsa.cs.3423 y
我已经尝试了s/^[0-9]//g
它似乎运作良好,但最后一行缺少4个数字
答案 0 :(得分:1)
使用awk
,打印第一个和最后一个字段,如果它仅由字母字符组成,则包括第二个字段:
awk '$2~/^[[:alpha:]]+$/ {print $1, $2, $NF; next} {print $1, $NF}' file.txt
如果您坚持使用sed
:
sed -E 's/^([^[:blank:]]+)[[:blank:]]+([[:alpha:]]+)?.*[[:blank:]]([^[:blank:]]+)$/\1 \2 \3/'
对于不具有字母第二个字段的行,这两个字段之间将有两个空格,您可以为此添加另一个sed
:
sed -E 's/^([^[:blank:]]+)[[:blank:]]+([[:alpha:]]+)?.*[[:blank:]]([^[:blank:]]+)$/\1 \2 \3/; s/ / /'
示例:强>
% cat file.txt
comp.os.linux announce 0000002587 02190 m
comp.arch 00000 28874 y
utsa.cs.3423 00000000004 000000000001 y
% awk '$2~/^[[:alpha:]]+$/ {print $1, $2, $NF; next} {print $1, $NF}' file.txt
comp.os.linux announce m
comp.arch y
utsa.cs.3423 y
% sed -E 's/^([^[:blank:]]+)[[:blank:]]+([[:alpha:]]+)?.*[[:blank:]]([^[:blank:]]+)$/\1 \2 \3/' file.txt
comp.os.linux announce m
comp.arch y
utsa.cs.3423 y
% sed -E 's/^([^[:blank:]]+)[[:blank:]]+([[:alpha:]]+)?.*[[:blank:]]([^[:blank:]]+)$/\1 \2 \3/; s/ / /' file.txt
comp.os.linux announce m
comp.arch y
utsa.cs.3423 y
答案 1 :(得分:1)
使用sed:
sed 's/ [0-9 ]\+[0-9]\+//' file
输出:
comp.os.linux announce m comp.arch y utsa.cs.3423 y