如何从bash中的.csv文件的一列中删除非数字字符?

时间:2017-06-28 22:03:23

标签: bash csv awk sed

我有一个包含不一致数据的大型.csv文件,如下所示:

O_T_11c,234858DEF8,OHL11_c_234858DEF8.csv,c
Ohl12und,234858DEF8,OHL12_u234858DEF8.csv,u
Ohlabx13und,234858DEF8,OHL13u_234858DEF8.csv,u
Ohl14und,234858DEF8,OHL14u_234858DEF8.csv,u

我想仅从第一列中删除所有字母,而将其余字母单独删除。我试图在awk中使用正则表达式来做到这一点,但这给了我 奇怪的输出。我希望我的输出最终是这样的:

11,234858DEF8,OHL11_c_234858DEF8.csv,c
12,234858DEF8,OHL12_u234858DEF8.csv,u
13,234858DEF8,OHL13u_234858DEF8.csv,u
14,234858DEF8,OHL14u_234858DEF8.csv,u

我知道我可以使用像这样的sed

sed 's/[^0-9]*//g'

删除所有非数字字符,但我只想将其应用于第一列。

2 个答案:

答案 0 :(得分:2)

awk 方法:

awk -F, '{ gsub(/[^0-9]/,"",$1) }1' OFS=',' file

输出:

11,234858DEF8,OHL11_c_234858DEF8.csv,c
12,234858DEF8,OHL12_u234858DEF8.csv,u
13,234858DEF8,OHL13u_234858DEF8.csv,u
14,234858DEF8,OHL14u_234858DEF8.csv,u

答案 1 :(得分:2)

现在我们知道实际输入是逗号分隔的,这是您问题的最快解决方案。

sed -i 's/^[^0-9]\+//;s/[^0-9,]\+//' largefile.csv

s/^[^0-9]\+// - 将从行的开头删除任何非数字。

s/[^0-9,]\+// - 将删除逗号之前的任何非数字跟踪数字。