我有一个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以外的表格持开放态度。
答案 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