如何使用shell删除文件中的前两列(awk,sed,whatever)

问题描述 投票:65回答:10

我有一个文件,每行有很多行,有很多列(字段)用空格分隔“”每行的列数不同我想删除前两列怎么样?

perl shell awk sed cut
10个回答
133
投票

你可以用cut做到这一点:

cut -d " " -f 3- input_filename > output_filename

说明:

  • cut:调用cut命令
  • -d " ":使用单个空格作为分隔符(cut默认使用TAB)
  • -f:指定要保留的字段
  • 3-:所有以字段3开头的字段
  • input_filename:使用此文件作为输入
  • > output_filename:将输出写入此文件。

或者,您可以使用awk执行此操作:

awk '{$1=""; $2=""; sub("  ", " "); print}' input_filename > output_filename

说明:

  • awk:调用awk命令
  • $1=""; $2="";:将字段1和2设置为空字符串
  • sub(...);:清理输出字段,因为字段1和2仍将由“”分隔
  • print:打印修改后的行
  • input_filename > output_filename:与上述相同。

0
投票

使用awk,并基于下面的一些选项,使用for循环使得更灵活;有时我可能想要删除前9列(例如,如果我执行“ls -lrt”),所以我将2改为9,就是这样:

awk '{ for(i=0;i++<2;){$i=""}; print $0 }' your_file.txt


22
投票

这是使用Awk做到这一点的一种方法,它相对容易理解:

awk '{print substr($0, index($0, $3))}'

这是一个没有模式的简单awk命令,因此每个输入行都会运行{}中的动作。

操作是简单地打印从第3个字段的位置开始的子字符串。

  • $0:整个输入线
  • $3:第3场
  • index(in, find):在字符串find中返回in的位置
  • substr(string, start):返回从索引start开始的子字符串

如果要使用其他分隔符(例如逗号),可以使用-F选项指定它:

awk -F"," '{print substr($0, index($0, $3))}'

您还可以通过在{}中的操作之前指定模式,对输入行的子集进行操作。只有与模式匹配的行才会运行操作。

awk 'pattern{print substr($0, index($0, $3))}'

模式可以是这样的东西:

  • /abcdef/:使用正则表达式,默认情况下运行$ 0。
  • $1 ~ /abcdef/:在特定领域开展业务。
  • $1 == blabla:使用字符串比较
  • NR > 1:使用记录/行号
  • NF > 0:使用字段/列号

12
投票

感谢您发布问题。我还想添加帮助我的脚本。

awk '{ $1=""; print $0 }' file

8
投票
awk '{$1=$2="";$0=$0;$1=$1}1'

输入

a b c d

产量

c d

6
投票

你可以使用sed

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

这将查找以一个或多个非空白,空白,另一组一个或多个非空白和另一个空白开头的行,并删除匹配的材料,即前两个字段。 [^ ][^ ]*比同等但更明确的[^ ]\{1,\}表示法略短,第二个可能与GNU sed有问题(尽管如果你使用--posix作为选项,甚至GNU sed也不能搞砸它)。 OTOH,如果要重复的字符类更复杂,则编号表示法为了简洁而获胜。很容易将其扩展为处理“空白或制表符”作为分隔符,或“多个空白”或“多个空格或制表符”。它也可以修改为在第一个字段之前处理可选的前导空格(或制表符)等。

对于awkcut,请参阅Sampson-Chenanswer。还有其他方法来编写awk脚本,但它们并不比给出的答案好得多。请注意,如果不希望将制表符视为分隔符,则可能需要在-F" "中明确设置字段分隔符(awk),或者字段之间可能有多个空格。 POSIX标准cut不支持字段之间的多个分隔符; GNU cut具有有用但非标准的-i选项,允许在字段之间使用多个分隔符。

您也可以在纯shell中执行此操作:

while read junk1 junk2 residue
do echo "$residue"
done < in-file > out-file

6
投票

它非常直接用shell做它

while read A B C; do
echo "$C"
done < oldfile >newfile

4
投票

perl的:

perl -lane 'print join(' ',@F[2..$#F])' File

AWK:

awk '{$1=$2=""}1' File

1
投票

这可能适合你(GNU sed):

sed -r 's/^([^ ]+ ){2}//' file

或者由一个或多个空格分隔的列:

sed -r 's/^(\S+\s+){2}//' file

0
投票

使用kscript

kscript 'lines.split().select(-1,-2).print()' file
© www.soinside.com 2019 - 2024. All rights reserved.