CSV行的第一个字母移动到字段末尾

CSV行的第一个字母移动到字段末尾,csv,sed,Csv,Sed,我有一个CSV文件,我想将第一个字母移动到第一个字符串的末尾,并在最后两个字符前面插入下划线。我找不到任何关于如何将信移到sed的信息。以下是我的示例: 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 例如,B9AT0582B4

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

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\u 41B

它需要对每一行执行此操作,并且不更改其他CSV值的状态

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

在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中第一个逗号前最多两个字符,以及捕获组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中第一个逗号前最多两个字符,以及捕获组3中逗号前的最后两个字符。然后替换替换并添加下划线。

以下是我对此的看法

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

这是我的看法

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

\u 41B
中的下划线是打字错误吗?不,我也需要下划线。它在哪里?问题在任何地方都没有提到它。9AT0582B_41B,需要介于字符和最后两位数字之间(尾随的B已经移动到字符串的末尾)…它应该是每行的第9列,而不会覆盖第9列。@Hunter-如果它是您正在寻找的解决方案的一部分,请描述它,不在评论中。。鉴于您的问题提到了
sed
,我还希望您的问题包括您在试图自己解决此问题时已经编写的
sed
代码,以及代码生成的输出(或错误)示例。
\u 41B
中的下划线是打字错误吗?不,我还需要下划线。它在哪里?问题在任何地方都没有提到它。9AT0582B_41B,需要介于字符和最后两位数字之间(尾随的B已经移动到字符串的末尾)…它应该是每行的第9列,而不会覆盖第9列。@Hunter-如果它是您正在寻找的解决方案的一部分,请描述它,不在评论中。。鉴于您的问题提到了
sed
,我还希望您的问题包括您在试图自己解决此问题时已经编写的
sed
代码,以及代码生成的输出(或错误)示例。@Hunter,您有一个如何使用
substr()
函数的示例。你能回答你自己的问题吗?这里是对其他awk内置字符串函数的引用:@hunter我已经编辑了您的问题以提及下划线,并更新了答案。@hunter,您有一个如何使用
substr()
函数的示例。你能回答你自己的问题吗?以下是对其他awk内置字符串函数的引用:@hunter我已经编辑了您的问题,以提及下划线,并更新了答案。