我有一个 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
使用grep
和pcre
$ 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