我的外壳有点生锈,所以我非常感谢在解析下列数据时的一些帮助。使用外壳解析CSV文件
输入文件中的每一行都包含用逗号分隔的数据。
[name, record_timestamp, action, field_id, field_name, field_value, number_of_fields]
这些行是用于创建或更新有关人员信息的说明。例如,第一行表示约翰史密斯将被创建,以下6行将包含关于他的信息。
field_id编号始终代表相同的字段。
input.csv
John Smith,2017-03-03 11:56:02,create,,,,6
,,,,1,BIRTH_DATE,1985-02-16,,
,,,,2,BIRTH_CITY,Portland,,
,,,,3,SEX,Male,,
,,,,5,CITY,Seattle,,
,,,,7,EMPLOYER,Microsoft,,
,,,,9,MARRIED,Yes,,
Susan Anderson,2017-03-01 12:09:36,create,,,,8
,,,,1,BIRTH_DATE,1981-09-12,,
,,,,2,BIRTH_CITY,San Diego,,
,,,,3,SEX,Female,,
,,,,5,CITY,Palo Alto,,
,,,,7,EMPLOYER,Facebook,,
,,,,8,SALARY,5612,,
,,,,9,MARRIED,No,,
,,,,10,TELEPHONE,5107586290,,
Brad Bradly,2017-02-29 09:15:12,update,,,,3
,,,,3,SEX,Male,,
,,,,7,EMPLOYER,Walmart,,
,,,,9,MARRIED,No,,
Sarah Wilson,2017-02-28 16:21:39,update,,,,5
,,,,2,BIRTH_CITY,Miami,,
,,,,3,SEX,Female,,
,,,,7,EMPLOYER,Disney,,
,,,,8,SALARY,5110,,
,,,,9,MARRIED,Yes,,
我想每位成员解析为逗号分隔字符串,看起来像这样:
name,birth date,birth city,sex,employer,salary,marrage status,record_timestamp
但我们应该只输出这样的字符串如果两个出生日期和出生城市或这两个字段雇主和工资是可用于该人。否则,请将其留空(参见下面的示例)。
鉴于我们上面的输出输入,则应该是
John Smith,1985-02-16,Portland,Male,,,Yes,2017-03-03 11:56:02
Susan Anderson,1981-09-12,San Diego,Female,Facebook,5612,No,2017-03-01 12:09:36
Sarah Wilson,,,Female,Disney,5110,Yes,2017-02-28 16:21:39
我已经想通了,我应该做的大意如下的东西。但是,我不知道如何实现一个内部循环,或者如果有其他方法可以继续。
#!/bin/bash
IFS=','
cat test.txt | while read -a outer
do
echo ${outer[0]}
#...
done
在此先感谢您的任何建议!
CSV文件格式是一个非常宽松的标准,比起简单的逗号分隔要复杂得多。为什么不在适当的CSV模块中使用脚本语言?他们*全部*拥有它们。 – tadman
如果您的输入确实是完全正常的,那么Awk脚本会更简单,更易读,并且速度更快。 – tripleee