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

我有一个在每一行有很多行的文件有很多列(字段)以空格分隔“”每行的列数是不同的我想删除前两列如何?

你可以用cut来做:

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

说明:

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

另外,你可以用awk来做:

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

说明:

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

这里有一个方法可以用Awk来实现,这个方法相对容易理解:

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

这是一个简单的awk命令,没有模式,所以{}内的动作对每个input行都运行。

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

  • $0 :整个input行
  • $3 :第三场
  • index(in, find) :返回findstringin的位置
  • substr(string, start) :返回从索引start的子串

如果您想使用不同的分隔符(如逗号),则可以使用-F选项指定它:

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

您也可以通过在{}的操作之前指定一个模式,在input行的一个子集上进行操作。 只有匹配模式的行才会执行该操作。

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

模式可以是如下的东西:

  • /abcdef/ :使用正则expression式,默认情况下操作$ 0。
  • $1 ~ /abcdef/ :在特定的字段上运行。
  • $1 == blabla :使用string比较
  • NR > 1 :使用logging/行号
  • NF > 0 :使用字段/列号

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

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

你可以使用sed

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

这将查找以一个或多个非空白,空白,另一组一个或多个非空白和另一个空白开始的行,并删除匹配的材料,即前两个字段。 [^ ][^ ]*比等效但更明确的[^ ]\{1,\}表示法稍微短一些,第二种可能遇到GNU sed问题(尽pipe如果使用--posix作为选项,即使GNU sed也不能把它搞砸)。 OTOH,如果要重复的angular色types更复杂,编号表示法为了简洁而胜出。 这很容易扩展,以处理“空白或制表符”作为分隔符,或“多个空白”或“多个空白或制表符”。 也可以修改它以处理第一个字段之前的可选前导空白(或制表符)等。

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

你也可以在纯shell中做到这一点:

 while read junk1 junk2 residue do echo "$residue" done < in-file > out-file 
 awk '{$1=$2="";$0=$0;$1=$1}1' 

input

 abcd 

产量

 cd 

它非常简单,只有壳来做

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

perl的:

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

AWK:

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

这可能适用于你(GNU sed):

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

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

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

使用kscript

 kscript 'lines.split().select(-1,-2).print()' file