如何使用shell来删除一个文件中的前两列(AWK,sed的,等等)(how to remove t

2019-07-03 23:25发布

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

Answer 1:

你可以做到这一点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 :与上面相同。


Answer 2:

下面是使用awk做到这一点的一种方式这是比较容易理解:

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

这是一个没有图形的简单命令AWK,所以动作内部{}运行对每个输入线。

动作是简单地打印开始与第三字段的位置的子字符串。

  • $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 :使用字段/列数


Answer 3:

感谢张贴的问题。 我还想补充一点,帮助过我的脚本。

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


Answer 4:

awk '{$1=$2="";$0=$0;$1=$1}1'

输入

a b c d

产量

c d


Answer 5:

您可以使用sed

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

这看起来用于开始与一个或更多的非空白,空白,另一组中的一个或更多的非空白和另一个空行,并删除匹配的材料,也称为前两个字段。 在[^ ][^ ]*稍高于等价,但更明确的短[^ ]\{1,\}符号,第二可能会遇到与GNU的问题sed (不过,如果你使用--posix作为一个选项,甚至GNU sed不能搞砸了)。 OTOH,如果要重复的字符类比较复杂,编号符号赢得了简洁。 这是很容易扩展这个处理“空白或标签”作为分隔符,或“多个坯件”或“多个空格或制表符”。 它也可以修改的第一场等前处理可选的前导空格(或制表符)

对于awkcut ,看到桑普森,陈的回答 。 还有其他的方法来写awk脚本,但他们没有实质性比给出的答案更好。 请注意,您可能需要明确设置字段分隔符( -F" "awk如果你不想作为分隔符处理选项卡,或者你可能有场之间的多个空白。 POSIX标准cut不支持字段之间的多重分隔符; GNU cut有有用的,但非标-i选项允许字段之间的多个分隔符。

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

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


Answer 6:

它非常直截了当只与外壳做

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


Answer 7:

perl的:

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

AWK:

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


Answer 8:

这可能会为你工作(GNU SED):

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

或用于通过一个或多个空格分开的列:

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


Answer 9:

使用小工具

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


Answer 10:

用awk,总部设在下面的一些选项,使用一个for循环,使一个更灵活一点; 有时我会想删除第9列(如果我做了一个“LS -lrt”为例),所以我改变了2 9,这就是它:

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



文章来源: how to remove the first two columns in a file using shell (awk, sed, whatever)