zar*_*ara 29 sed awk perl text-processing
我想删除一个txt文件的最后一列,而我不知道列号是什么。我怎么能这样做?
例子:
输入:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
Run Code Online (Sandbox Code Playgroud)
我希望我的输出是:
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
Run Code Online (Sandbox Code Playgroud)
cuo*_*glm 54
与awk
:
awk 'NF{NF-=1};1' <in >out
Run Code Online (Sandbox Code Playgroud)
或者:
awk 'NF{NF--};1' <in >out
Run Code Online (Sandbox Code Playgroud)
或者:
awk 'NF{--NF};1' <in >out
Run Code Online (Sandbox Code Playgroud)
虽然这看起来像伏都教,但它确实有效。这些 awk 命令中的每一个都包含三个部分。
第一个是NF
,这是第二个部分的前提。NF
是一个变量,包含一行中的字段数。在 AWK 中,如果它们不是 0 或空 string ,则为真""
。因此,第二部分(NF
减量的地方)仅在NF
不为 0时发生。
第二部分(NF-=1
NF--
或--NF
)只是从NF
变量中减去一个。这可以防止打印最后一个字段,因为当您更改一个字段时(在这种情况下删除最后一个字段),awk
re-construct $0
,默认连接所有由空格分隔的字段。$0
不再包含最后一个字段。
最后一部分是1
。这并不神奇,它只是用作表达的意思true
。如果awk
表达式的计算结果为 true 而没有任何关联的操作,则awk
默认操作为print $0
。
hee*_*ayl 16
grep
与 PCRE 一起使用:
$ grep -Po '.*(?=\s+[^\s]+$)' file.txt
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
Run Code Online (Sandbox Code Playgroud)
使用 GNU sed
:
$ sed -r 's/(.*)\s+[^\s]+$/\1/' file.txt
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
Run Code Online (Sandbox Code Playgroud)
kos*_*kos 16
使用 Perl:
perl -lane '$,=" ";pop(@F);print(@F)' in
Run Code Online (Sandbox Code Playgroud)
使用rev
+ cut
:
rev in | cut -d ' ' -f 2- | rev
Run Code Online (Sandbox Code Playgroud)
使用 GNU sed:
sed -r 's/\s+\S+$//' input.txt
Run Code Online (Sandbox Code Playgroud)
更一般地说,这适用于 OSX 中的 BSD sed,以及 GNU sed:
sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}$//' input.txt
Run Code Online (Sandbox Code Playgroud)