我在每一行有很多列(字段)的空白“”在每行的列数分离与许多行的文件是不同的我想删除前两列如何?
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,如果要重复的字符类比较复杂,编号符号赢得了简洁。 这是很容易扩展这个处理“空白或标签”作为分隔符,或“多个坯件”或“多个空格或制表符”。 它也可以修改的第一场等前处理可选的前导空格(或制表符)
对于awk
和cut
,看到桑普森,陈的回答 。 还有其他的方法来写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