我有一个格式化的进程列表(顶部输出),我想删除不必要的信息。如何删除例如每行的第二个单词+空格。
示例:
1 a hello
2 b hi
3 c ahoi
我想删除b和c。
答案 0 :(得分:10)
您可以使用cut
命令。
cut -d' ' -f2 --complement file
--complement
做反过来。即选择了-f2
第二个字段。如果打印除第二个以外的所有字段,则使用--complement
。当您具有可变数量的字段时,这非常有用。
GNU的剪切具有选项--complement
。如果--complement
不可用,则以下内容相同:
cut -d'' - f1,3- file
含义:打印第一个字段,然后从第3个字段打印到结尾,即排除第二个字段并打印其余字段。 修改强>
如果您愿意awk
,可以执行:awk {$2=""; print $0}' file
这会将第二个设置为空并打印整行(逐个)。
答案 1 :(得分:5)
使用sed
替换第二列:
sed -r 's/(\w+\s+)\w+\s+(.*)/\1\2/' file
1 hello
2 hi
3 ahoi
说明:
(\w+\s+) # Capture the first word and trailing whitespace
\w+\s+ # Match the second word and trailing whitespace
(.*) # Capture everything else on the line
\1\2 # Replace with the captured groups
注意:使用-i
选项将结果保存回file
,-r
用于扩展正则表达式,检查man
可能是-E
awk
1}}取决于实施。
或使用$ awk '{print $1, $3}' file
1 hello
2 hi
3 ahoi
仅打印指定的列:
awk
两种解决方案都有优点,awk '{print $1, $3}' file > tmp; mv tmp file
解决方案适用于少量固定数量的列,但您需要使用临时文件将更改存储sed
作为-i
解决方案更灵活,因为列不是问题,{{1}}选项可以进行编辑。
答案 2 :(得分:3)
使用sed
的一种方式:
sed 's/ [^ ]*//' file
结果:
1 hello
2 hi
3 ahoi
答案 3 :(得分:3)
使用Bash:
$ while read f1 f2 f3
> do
> echo $f1 $f3
> done < file
1 hello
2 hi
3 ahoi
答案 4 :(得分:3)
这可能适合你(GNU sed):
sed -r 's/\S+\s+//2' file