我需要从具有双引号的大文件中提取数据到文本文件中。 列数是固定的,但如果一行中没有可用的数据(例如,第一行中的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
答案 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可用于隔离具有匹配属性模式的部分线。请注意,属性值内的任何双引号都可能导致此代码失败。