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 |
例如
它需要为每一行执行此操作,而不更改其他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 |
这将输入和输出字段分隔符设置为
或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 \\的
1 2 | $ sed 's/\\(.\\)\\(.\\{8\\}\\)\\([^,]*\\)\\(.*\\)/\\2_\\3\\1\\4/' <<<"B9AT0582B41,430,30,0,Loop" 9AT0582B_41B,430,30,0,Loop |