在Shell脚本中用双引号引起来的字符串之间提取数据

时间:2019-04-10 18:12:25

标签: shell unix

我需要从具有双引号的大文件中提取数据到文本文件中。 列数是固定的,但如果一行中没有可用的数据(例如,第一行中的acct_address和phne_nm缺少,第二行中的phne_num丢失,第三行中的acct_address丢失),则该列将丢失

文件中的数据

<acc_details acct_no=""00000"" acct_nm=""John""/>
<acc_details acct_no=""00001"" acct_address=""109 BIRHN WAY "" acct_nm=""BARNS WY""/>
<acc_details acct_no=""00002"" acct_nm=""BILL BAR"" phne_nm=""123456""/>

预期结果

acct_no,acct_address,acct_nm,phne_nm
00000,,John,
00001,109 BIRHN WAY,BARNS WY,
00002,,BILL BAR,123456

1 个答案:

答案 0 :(得分:1)

这可能不是最优雅的解决方案,但它应适用于大多数情况。可以改进。

echo "acct_no,acct_address,acct_nm,phne_nm" > res
while read line ; do
    acct_no=$(echo $line | grep -Eoh 'acct_no="".*?""' | cut -d\" -f3)
    acct_nm=$(echo $line | grep -Eoh 'acct_nm="".*?""' | cut -d\" -f3)
    acct_address=$(echo $line | grep -Eoh 'acct_address="".*?""' | cut -d\" -f3)
    phne_nm=$(echo $line | grep -Eoh 'phne_nm="".*?""' | cut -d\" -f3)
    echo $acct_no,$acct_address,$acct_nm,$phne_nm >> res
done < file

grep和cut可用于隔离具有匹配属性模式的部分线。请注意,属性值内的任何双引号都可能导致此代码失败。

相关问题