我有一个以下格式的数据文件:
源文件(出于说明目的的示例.)
ALBANIA Duck 1000
BELGIUM CHARLEROI Donald Duck 10234
CYPRUS J. Mickey 567
我正在寻找一个 Linux 脚本(Bash、perl 等等)来将信息提取为csv
格式,并具有给定的规则:
- 第一名in 字段
csv
仅包含 in 中的整个单词大写 - 第三名中的字段
csv
包含最后一个输入字段(数字) - 第二名中的字段
csv
包含其余的中间部分
所以预期的输出应该是:
输出.csv
ALBANIA,Duck,1000
BELGIUM CHARLEROI,Donald Duck,10234
CYPRUS J.,Mickey,567
答案1
便携:
sed 's/\([^[:lower:]]*\) \(.*\) /\1,\2,/' < source.dat > output.csv
答案2
如果直接按照要求做
sed -r 's/([[:upper:] .]+)\s+(.*)\s+([0-9]+)\s*$/\1,\2,\3/' file
正如我们所看到的,field1 保留在原处,因此我们可以简化脚本
sed -r 's/\s+(\w*[[:lower:]].*)\s+([0-9]+)\s*$/,\1,\2/' file
甚至
sed -r 's/\s+(\w*[[:lower:]].*[^0-9])\s+/,\1,/' file