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

wen*_*nzi 68 shell perl awk cut sed

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

sam*_*hen 138

你可以这样做cut:

cut -d " " -f 3- input_filename > output_filename
Run Code Online (Sandbox Code Playgroud)

说明:

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

或者,你可以这样做awk:

awk '{$1=""; $2=""; sub("  ", " "); print}' input_filename > output_filename
Run Code Online (Sandbox Code Playgroud)

说明:

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


ray*_*chi 22

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

awk '{print substr($0, index($0, $3))}'
Run Code Online (Sandbox Code Playgroud)

这是一个没有模式的简单awk命令,因此{}每个输入行都会运行内部操作.

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

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

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

awk -F"," '{print substr($0, index($0, $3))}'
Run Code Online (Sandbox Code Playgroud)

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

awk 'pattern{print substr($0, index($0, $3))}'
Run Code Online (Sandbox Code Playgroud)

模式可以是这样的东西:

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

  • 如果字段#2和字段#3具有相同的内容,则这将无法正常工作. (8认同)

Fel*_*rez 12

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

awk '{ $1=""; print $0 }' file
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 6

你可以使用sed:

sed 's/^[^ ][^ ]* [^ ][^ ]* //'
Run Code Online (Sandbox Code Playgroud)

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

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

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

while read junk1 junk2 residue
do echo "$residue"
done < in-file > out-file
Run Code Online (Sandbox Code Playgroud)


tec*_*rus 6

它非常直接用shell做它

while read A B C; do
echo "$C"
done < oldfile >newfile
Run Code Online (Sandbox Code Playgroud)


Vij*_*jay 5

珀尔:

perl -lane 'print join(' ',@F[2..$#F])' File
Run Code Online (Sandbox Code Playgroud)

awk:

awk '{$1=$2=""}1' File
Run Code Online (Sandbox Code Playgroud)