在Linux服务器上的csv文件中,我有数千行以下csv格式
0,20221208195546466,9,200,Above as:2|RAN34f2fb:HAER:0|RAND8365b2bca763:FON:0|RANDa7a5f964900b:ION:0|
我需要从以下格式的所有文件中获得输出(第二个字段即20221208195546466和第五个字段,但在Above as:
之后和第一个之前的值在上面的例子中| ie 2)
输出:
20221208195546466 , 2
有谁能帮我一下linux命令吗?
编辑:
我尝试我试过,但它给字段第5个值。如何添加字段2以及?
cat *.csv | cut -d, -f5|cut -d'|' -f1|cut -d':' -f2|
编辑:排序结果
现在我使用这个命令(基于Dave Pritlove的回答)awk -F'[,|:]' '{print $2", "$6}' file.csv。但是,我还有一个查询,如果我必须根据$6(在您的示例中值2)对输出进行排序,那么我该如何做呢?我想要的结果应该显示在排序的顺序基于第二个输出字段。例如:
20221208195546366, 20
20221208195546436, 165
20221208195546466,
2022120819536466, 2
Gnu awk
允许设置多个字段分隔符,允许您同时在,
,|
和:
分隔每个记录。因此,下面将从file.csv
中找出所需的字段:
awk -F'[,|:]' '{print $2", "$6}' file.csv
在单记录示例上测试:
echo "0,20221208195546466,9,200,Above as:2|RAN34f2fb:HAER:0|RAND8365b2bca763:FON:0|RANDa7a5f964900b:ION:0|" | awk -F'[,|:]' '{print $2", "$6}'
输出:
20221208195546466, 2
假设:
- 第5个以逗号分隔的字段的起始字符串可以每行不同(即,之前不知道)
- 第5个逗号分隔字段中感兴趣的项出现在第一个
:
和第一个|
之间
样本数据:
$ cat test.csv
0,20221208195546466,9,200,Above as:2|RAN34f2fb:HAER:0|RAND8365b2bca763:FON:0|RANDa7a5f964900b:ION:0|
1,20230124123456789,10,1730,Total ts:7|stuff:HAER:0|morestuff:FON:0|yetmorestuff:ION:0|
一个awk
方法:
awk '
BEGIN { FS=OFS="," } # define input/output field delimiter as ","
{ split($5,a,"[:|]") # split 5th field on dual delimiters ":" and "|", store results in array a[]
print $2,a[2] # print desired items to stdout
}
' test.csv
由此产生:
20221208195546466,2
20230124123456789,7
您可以使用awk:
awk -F',' '{gsub(/Above as:/,""); gsub(/|.*/, ""); print($2, $5)}'
可能需要采用一点regexp
您可以将:
更改为,
,|
更改为,
,然后使用cut
按照以下方式提取第2和第6字段,让file.txt
内容为
0,20221208195546466,9,200,Above as:2|RAN34f2fb:HAER:0|RAND8365b2bca763:FON:0|RANDa7a5f964900b:ION:0|
然后
tr ':|' ',,' < file.txt | cut --delimiter=',' --output-delimiter=' , ' --fields=2,6
给输出
20221208195546466 , 2
解释:tr
翻译,即使用,
替换:
,使用,
替换|
,然后我通知cut
,输入中的分隔符是,
输出分隔符,包含在空格中(根据您所需的输出规定),并希望第2列和第6列(不是第5列,因为它现在是Above as
)
(使用GNU coretils 8.30测试)