5

我有一个格式化的进程列表(顶部输出),我想删除不必要的信息。例如,如何删除每行的第二个单词+空格。

例子:

1 a hello
2 b hi
3 c ahoi

我想删除 ab 和 c。

4

5 回答 5

10

你可以使用cut命令。

 cut -d' ' -f2 --complement file

--complement做相反的事情。即-f2选择了第二个字段。并使用--complementif 打印除第二个以外的所有字段。当您有可变数量的字段时,这很有用。

GNU 的 cut 有选项--complement. 如果,--complement则不可用,则以下操作相同:

剪切 -d' ' -f1,3- 文件

含义:打印第一个字段,然后从第三个字段打印到末尾,即排除第二个字段并打印其余字段。 编辑:

如果你愿意awk,你可以这样做:awk {$2=""; print $0}' file

这会将第二个设置为空并打印整行(一个接一个)。

于 2012-12-06T10:31:40.830 回答
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仅打印指定的列:

$ awk '{print $1, $3}' file
1 hello
2 hi
3 ahoi

两种解决方案都有优点,该awk解决方案适用于少量固定数量的列,但您需要使用临时文件来存储更改awk '{print $1, $3}' file > tmp; mv tmp file,因为该sed解决方案更灵活,因为列不是问题,并且-i选项在地方。

于 2012-12-06T10:29:54.207 回答
3

一种使用方式sed

sed 's/ [^ ]*//' file

结果:

1 hello
2 hi
3 ahoi
于 2012-12-06T10:34:17.367 回答
3

使用重击:

$ while read f1 f2 f3
> do
>  echo $f1 $f3
> done < file
1 hello
2 hi
3 ahoi
于 2012-12-06T10:36:13.033 回答
3

这可能对您有用(GNU sed):

sed -r 's/\S+\s+//2' file
于 2012-12-06T13:02:32.980 回答