Ari*_*ury 5 rhel awk text-processing csv
需要使用 shell 命令转换分隔文件。接收到的输入文件有两种变体,一种带有双引号,另一种不带引号,并且两个文件都以逗号作为分隔符。要求是用 TAB 替换逗号并删除引号(如果文件有双引号),否则只需替换逗号。如果文件的字段也包含在转换时需要忽略的逗号,则文件将带有引号发送。 单个命令应该在 RHEL 6.x 环境上的 Awk 3.x 中有效。
例如。带双引号的文件1:
"Jhon","Carpenter","CA,TX,NJ"
"Mike","Painter","WA,GA,MI"
Run Code Online (Sandbox Code Playgroud)
转换后应该用制表符分隔:
Jhon Carpenter CA,TX,NJ
Mike Painter WA,GA,MI
Run Code Online (Sandbox Code Playgroud)
例如。文件2不带双引号:
EMP1,123456,CA
EMP2,456789,TX
Run Code Online (Sandbox Code Playgroud)
转换后应该用制表符分隔:
EMP1 123456 CA
EMP2 456789 TX
Run Code Online (Sandbox Code Playgroud)
使用csvkit:
$ csvformat -T file1.csv
Jhon Carpenter CA,TX,NJ
Mike Painter WA,GA,MI
$ csvformat -T file2.csv
EMP1 123456 CA
EMP2 456789 TX
Run Code Online (Sandbox Code Playgroud)
的输出file1.csv看起来有点不对劲,但这只是因为选项卡没有正确排列。所有列之间都有一个选项卡。
CSVKit 是一个基于 Python 的工具箱,包含各种 CSV 相关的 shell 实用程序。它可以进行正确的 CSV 解析,并可用于查询、格式化和转换 CSV 文件。
例如,如果第一个文件有正确的标头,那么将其转换为 JSON 就很简单
$ csvjson file1.csv
[{"First": "Jhon", "Last": "Carpenter", "Stuff": "CA,TX,NJ"}, {"First": "Mike", "Last": "Painter", "Stuff": "WA,GA,MI"}]
Run Code Online (Sandbox Code Playgroud)
这个简短的sed脚本可以处理两种类型的文件(甚至可以处理具有第一和第二类型行的混合文件):
sed '/"/!s/,/\t/g;s/","/\t/g; s/"//g'
Run Code Online (Sandbox Code Playgroud)
由于它不会对不循环的表达式进行分组,因此它应该比您的脚本快得多。
你似乎有 GNU sed,所以\t可以工作,否则使用文字 TAB 代替。