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 解析器.
您好,我有一份格式如下的 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"}
- 第一行打印新的 headerNR > 1 { print ,,}
- 对于其余行打印字段 $3,$4,$5
注意: 这假定 CSV 的其余部分没有 ,
或 @$
转义,否则您应该使用正确的 CSV 解析器.