检索 csv 中的最后一个元素

检索 csv 中的最后一个元素

我有一个 CSV 文件,如下所示

input.csv
1,2,3
4,5,6,7,8
9,10,11,12

从此我想得到

output.csv
3
8
12

我知道对于特定的固定大小列,我可以使用

cut -d \, -f 1 >output.csv

由于此栏位置各不相同,我无法找到它。感谢任何帮助。提前致谢。

答案1

一个解决方案是:

awk -F "," '{print $NF}' input.csv > output.csv

答案2

awk -F, '{print $NF}'正如已经给出的,最适合这种情况


其他方法:

您可以反转行,获取第一列,然后再次反转

$ rev input.csv | cut -d, -f1 | rev
3
8
12


使用sed

$ sed 's/.*,\(.*\)/\1/' input.csv 
3
8
12


使用greppcre

$ grep -oP '.*,\K.*' input.csv  
3
8
12

答案3

我建议使用可以实际解析 CSV 文件的东西,以防最后一个字段本身包含逗号,例如

13,14,15,"this, here"

最后一个字段是this, here, 不是here"

我会使用 python,你可以将其放入脚本中,或者你可以在命令行中伪造脚本,例如

python <(cat <<EOSCRIPT
import sys
import csv
f = csv.reader(open(sys.argv[1]))
for row in f:
  print row[-1]
EOSCRIPT
) input.csv > output.csv 

答案4

由于所讨论的 CSV 数据是一个不寻常的 CSV 文件(没有标题且每条记录的字段数量不同),因此我选择使用更常规的 CSV 文件,其中包含 5 个字段,包括标题:

$ mlr --icsv --omd cat file
第一名 第二名 第三名 第四名 第五名
1 2 3 4 5
带逗号的字段 C D
6 7 8 9 0x0A
A C D 你好世界
1st,2nd,3rd,4th,5th
1,2,3,4,5
"field with, comma",B,C,D,E
6,7,8,9,0x0A
A,B,C,D,"Hello, world"

我们可以通过名称从中提取最后一列,如下所示:

$ mlr --csv cut -f '5th' file
5th
5
E
0x0A
Hello, world

...或按字段编号,如下所示:

$ mlr --csv -N cut -f 5 file
5th
5
E
0x0A
Hello, world

...或者通过选择最后一个字段的任何字段:

$ mlr --csv -N put -q 'print $[NF]' file
5th
5
E
10
Hello, world

请注意-N上面最后两个命令中的选项。这指示mlr将数据读取为无标头 CSV 文件。这允许我们通过数字而不是名称来引用字段。


显然,您仍然可以使用不规则的 CSV 文件,例如所讨论的文件。你只需要告诉mlr输入是“不规则的”:

$ mlr --csv --ragged -N put -q 'print $[NF]' file
3
8
12

相关内容