CSV首字母移动到字段末尾

时间:2017-12-01 17:54:50

标签: csv sed

我有一个CSV文件,我想将第一个字母移动到第一个字符串的末尾,并在最后两个字符的前面插入一个下划线。我找不到任何关于如何用sed移动信件的信息。这是我的示例CSV:

name,number,number1,status,mode 
B9AT0582B41,430,30,0,Loop
B8AU0302D11,448,0,0,Loop
B8AU0302D21,448,0,0,Loop
B8AU0302D31,448,0,0,Loop
B8AU0302D41,448,0,0,Loop

例如B9AT0582B41,我希望它为9AT0582B_41B

它需要为每一行执行此操作,而不是更改其他CSV值的状态。

我对sed以外的表格持开放态度。

2 个答案:

答案 0 :(得分:3)

在awk中:

$ awk -F, -v OFS=, \
    'NR > 1 { $1 = substr($1, 2, 8) "_" substr($1, 10) substr($1, 1, 1) } 1' infile
name,number,number1,status,mode
9AT0582B_41B,430,30,0,Loop
8AU0302D_11B,448,0,0,Loop
8AU0302D_21B,448,0,0,Loop
8AU0302D_31B,448,0,0,Loop
8AU0302D_41B,448,0,0,Loop

这将输入和输出字段分隔符设置为,;然后,对于每一行(第一个除外)重新排列第一个字段(三次调用substr),然后打印该行(最后为1)。

或者sed,有点短:

sed -E '2,$s/^(.)([^,]*)([^,]{2})/\2_\3\1/' infile

它捕获捕获组1中每行(对于第2行和第2行)的第一个字母,然后捕获第2组中第一个逗号之前的两个字符以及捕获组3中逗号之前的最后两个字符。替换然后交换并添加下划线。

答案 1 :(得分:1)

这是我对此的看法。

$ sed -E 's/(.)(.{8})([^,]*)(.*)/\2_\3\1\4/' <<<"B9AT0582B41,430,30,0,Loop"
9AT0582B_41B,430,30,0,Loop

这使用扩展的正则表达式来使事情更容易阅读。 Sed的-E选项导致RE以扩展符号解释。如果您的sed版本不支持此功能,请查看您的手册页以查看是否有其他选项执行相同的操作,或者您可以尝试使用BRE表示法:

$ sed 's/\(.\)\(.\{8\}\)\([^,]*\)\(.*\)/\2_\3\1\4/' <<<"B9AT0582B41,430,30,0,Loop"
9AT0582B_41B,430,30,0,Loop