在CSV文件中,我想在UNIX中从文件的第3列中切出10个字符中的前5个字符

时间:2019-03-08 08:30:47

标签: linux unix

输入文件内容

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  

3 个答案:

答案 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