CSV数据多级解析Shell脚本

CSV data multiple level parsing Shell script

您好,我有一份格式如下的 CSV 数据

ColumnHeader1,ColumnHeader2,ColumnHeader3
valcol1p1,name=testapp1 environment=dev coldata=My_Test_Logs @$ 192.168.1.1 @$ r1 @$ r2 @$ POST API ,valcol3p1
valcol1p1,name=testapp2 environment=qa coldata=My_Test_Logs @$ 192.168.1.1 @$ r1 @$ r2 @$ GET API ,valcol3p1 

我需要在 My_Test_Logs 之后提取 ColumnHeader2 列中的数据,并在 delimtter '@$' 之后解析数据。因此,对于每个 csv 行,我将获得 4 个值。 我需要将它们与相同的分隔符值“@$”连接起来并放入 CSV 中。

输出将是这样的

现在我已经部分解决了。

想获取ColumnHeader2列数据

awk -F "\"*,\"*" '{print }' Mytest.csv

或使用多个字符定界符仅获取前 x 个字段:

awk -F"[@][$]" '{print ,,,}' Mytest1.csv
其中 MyTest1 包含提取的 Columnheader2 数据的输出

但是提取和连接的整个逻辑一起给出了一些问题。有人可以帮助 here.I 需要一个脚本来处理我的 CSV 并将结果写入另一个 csv 而不是使用多个 csv 或中间的文本输出?

使用 awk 在 My_Test_Logs:

处拆分
$ awk -F, '{print (split(,a,/My_Test_Logs /)>1?a[2]:a[1])}' file

输出:

ColumnHeader2
@$ 192.168.1.1 @$ r1 @$ r2 @$ POST API 
@$ 192.168.1.1 @$ r1 @$ r2 @$ GET API 

更新:

鉴于更好的呈现预期输出:

$ awk -F, '{print (split(,a,/ /)>1?a[5] OFS a[6] OFS a[7] OFS a[8] OFS a[9] OFS a[10] OFS a[11] OFS a[12]:a[1])}' file

现在输出:

ColumnHeader2
192.168.1.1 @$ r1 @$ r2 @$ POST API
192.168.1.1 @$ r1 @$ r2 @$ GET API

与大多数 bash 工具不同,这将以安全的方式处理 CSV。

#!/usr/local/bin/python3

import csv
csvr = csv.reader(open('your_file.csv'), delimiter = ",")

results = []
index=0
for row in csvr:
    if index == 0:
        index = index +1
        continue
    results.append(row[1].split('@$')[1:])

for row in results:
    print(",".join(row))

输出:

 192.168.1.1 , r1 , r2 , POST API 
 192.168.1.1 , r1 , r2 , GET API

希望对您有所帮助!

这应该满足您的两个要求:

awk -F',| *@[$] *' -v OFS='@$' -e 'NR==1 {print "outCol1","outCol2","outcol3"}; NR > 1 { print ,,}' sample.txt

outCol1@$outCol2@$outcol3
192.168.1.1@$r1@$r2
192.168.1.1@$r1@$r2
  • -F',|@[$]' - field separator is a regular expression in awk, this will match both,and@$, and also trim the spaces around@$`
  • -v OFS='@$' - 输出的默认字段分隔符是 space,这会将其设置为 '@$'
  • NR == 1 {print "outCol1","outCol2","outcol3"} - 第一行打印新的 header
  • NR > 1 { print ,,} - 对于其余行打印字段 $3,$4,$5

注意: 这假定 CSV 的其余部分没有 ,@$ 转义,否则您应该使用正确的 CSV 解析器.