关于sed:CSV首行字母已移至字段结尾

CSV first letter of line moved to end of field

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

1
2
3
4
5
6
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以外的其他形式持开放态度。


awk中:

1
2
3
4
5
6
7
8
$ 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,短一点:

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

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


这是我的看法。

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

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

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