如何在 Linux 中删除文件的最后一列

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变量中减去一个。这可以防止打印最后一个字段,因为当您更改一个字段时(在这种情况下删除最后一个字段),awkre-construct $0,默认连接所有由空格分隔的字段。$0不再包含最后一个字段。

最后一部分是1。这并不神奇,它只是用作表达的意思true。如果awk表达式的计算结果为 true 而没有任何关联的操作,则awk默认操作为print $0

  • 值得注意的是,如果您使用的是非默认分隔符,则需要进行一些更改。假设`,` 是你的分隔符:`awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' &lt;进&gt; 出` (7认同)
  • 递减 NF 的效果是 POSIX 未定义的行为 - 根据您正在运行的 awk,您将获得不同的输出。有些 awk 会根据需要删除最后一个字段,有些什么都不做,而其他人可能会报告语法错误或其他任何内容。 (2认同)

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)

  • 不要问诸如“[如何在 Linux 中重命名文件名](https://www.google.com/search?q=how+can+i+rename+a+file+name+in +Linux)”。使用谷歌。 (3认同)

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)


Dig*_*uma 5

使用 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)