如何使用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)
:返回find
stringin
的位置 -
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更复杂,编号表示法为了简洁而胜出。 这很容易扩展,以处理“空白或制表符”作为分隔符,或“多个空白”或“多个空白或制表符”。 也可以修改它以处理第一个字段之前的可选前导空白(或制表符)等。
对于awk
和cut
,请参阅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