我想删除txt文件的最后一列,但我不知道列号是什么。我该怎么办?
例:
输入:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
我希望我的输出是:
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
我想删除txt文件的最后一列,但我不知道列号是什么。我该怎么办?
例:
输入:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
我希望我的输出是:
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
Answers:
与awk
:
awk 'NF{NF-=1};1' <in >out
要么:
awk 'NF{NF--};1' <in >out
要么:
awk 'NF{--NF};1' <in >out
尽管这看起来像伏都教,但它确实有效。这些awk命令每个都有三个部分。
第一个是NF
,这是第二部分的前提。NF
是一个变量,包含一行中的字段数。在AWK中,如果它们不是0或为空string,则为true ""
。因此,第二部分(NF
递减的位置)仅在NF
不为0 时发生。
第二部分(NF-=1
NF--
或--NF
)只是从NF
变量中减去一个。这样可以防止最后一个字段被打印,因为更改字段时(在这种情况下,请删除最后一个字段),请awk
重新构造$0
,默认情况下将所有用空格分隔的字段连接起来。$0
不再包含最后一个字段。
最后一部分是1
。它不是神奇的,只是用作表示的表达式true
。如果awk
表达式在没有任何关联操作的awk
情况下计算为true,则默认操作为print $0
。
--
。注释,当前,您需要;1
兼容POSIX。
,
是您的分隔符:awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
grep
与PCRE一起使用:
$ grep -Po '.*(?=\s+[^\s]+$)' file.txt
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
使用GNU sed
:
$ sed -r 's/(.*)\s+[^\s]+$/\1/' file.txt
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
如果定界符始终是单个字符(因此两个或多个连续定界符指定为空字段),则可以head
仅从输入文件的第一行开始,计算定界符(n
定界符表示字段数为n+1
),然后用于cut
从1
st字段打印直到n
第th个字段(倒数第二个),例如使用制表符分隔的输入:
n=$(head -n 1 infile | tr -dc \\t | tr \\t \\n | wc -l)
cut -f1-$n infile > outfile
或例如与一个csv文件:
n=$(head -n 1 infile | tr -dc , | tr , \\n | wc -l)
cut -d, -f1-$n infile > outfile
如果有时间,我将在以后运行一些基准测试,但是投入大量精力,我认为该解决方案应该比其他使用regex的解决方案更快,因为此解决方案在第一行进行最少的处理即可获得否。字段,然后使用cut
为该工作优化的字段。