输入文件内容
abcde,12345,fedefg12345,aaaaaaa
abcde,12785,feeefg12345,aaaaaaa
abcde,12845,fezefg12345,aaaaaaa
abcde,12995,femefg12345,aaaaaaa
在CSV文件中,我想在UNIX中从文件的第3列中切出10个字符中的前5个字符。 注意:-更改应反映在文件本身中。
预期输出:-
abcde,12345,12345,aaaaaaa
abcde,12785,12345,aaaaaaa
abcde,12845,12345,aaaaaaa
abcde,12995,12345,aaaaaaa
答案 0 :(得分:1)
易于使用Perl和Text::CSV_XS:
perl -MText::CSV_XS=csv -we 'csv(in => shift,
on_in => sub { substr $_[1][2], 0, 6, "" }
)' -- file.csv
另请参阅substr。
答案 1 :(得分:0)
您可以使用awk
非常简单地完成此操作,它是substr
字符串处理命令,例如
$ awk -F, -v OFS=',' '{$3 = substr ($3, 7)} 1' file
abcde,12345,12345,aaaaaaa
abcde,12785,12345,aaaaaaa
abcde,12845,12345,aaaaaaa
abcde,12995,12345,aaaaaaa
其中-F,
将字段分隔符设置为','
,而OFS
(输出字段分隔符)设置为','
。
说明
-F, -v OFS=','
将字段分隔符和输出字段分隔符设置为comma
。{$3 = substr ($3, 7)}
从第3个字段中删除前6个字符(保存从字符7开始的子字符串),并将第3个字段替换为子字符串。1
输出具有指定分隔符的所有字段。将其全部放入即可提供一种简单的方法来解析您的.csv
文件。
注意::如果第3个字段中的字符数可以变化,并且您只希望最后5个字符(与数字无关),则可以使用length()
函数来获取最后一个字符(并减去4
以显示最后一个5
),例如
$ awk -F, -v OFS=',' '{$3 = substr ($3, length($3) - 4)} 1' file
<same output>
基于第三个字段中的第7个字符的请求的编辑== 0
请记住,与C不同,awk
索引从1
开始而不是0
。因此,如果要检查显示的最后5个字符的第1个字符是否为0
,则需要检查第7个字符。您可以使用另一个substr
然后使用三元运算符(例如
新示例数据文件
$ cat file
abcde,12345,fedefg12345,aaaaaaa
abcde,12785,feeefg12345,aaaaaaa
abcde,12845,fezefg12345,aaaaaaa
abcde,12995,femefg12345,aaaaaaa
abcde,13001,femefg02345,aaaaaaa
(最后一行包含您的条件)
使用/输出示例
$ awk -F, -v OFS=',' '{$3 = substr($3,length($3)-(substr($3,7,1)==0?3:4))} 1' file
abcde,12345,12345,aaaaaaa
abcde,12785,12345,aaaaaaa
abcde,12845,12345,aaaaaaa
abcde,12995,12345,aaaaaaa
abcde,13001,2345,aaaaaaa
(我已经抽出了空格,以防止行换行或滚动)
答案 2 :(得分:0)
awk -F, '{sub(/.{6}/,"",$3)}1' OFS="," file
abcde,12345,12345,aaaaaaa
abcde,12785,12345,aaaaaaa
abcde,12845,12345,aaaaaaa
abcde,12995,12345,aaaaaaa