将每行的第三个逗号替换为换行符

将每行的第三个逗号替换为换行符

我有这些很长的 ID,由四个部分组成:

AKJHGFGUIKL,OIUYT,KJHBTYUI,98765434567
RTYUIKHGFGH,TYUJI,TGHYJKJKLJKL,6789876
ETRYTUUI,YTYUIL,UIOKJHGFGH,34567898766

我想将数字放在新行中并删除第三个逗号。

AKJHGFGUIKL,OIUYT,KJHBTYUI
98765434567

RTYUIKHGFGH,TYUJI,TGHYJKJKLJKL
6789876

ETRYTUUI,YTYUIL,UIOKJHGFGH
34567898766

我怎样才能做到这一点?

答案1

使用 GNU sed

sed "s/,/\n/3; G" file

ETRYTUUI,YTYUIL,UIOKJHGFGH
34567898766

解释

答案2

awk -F, -vOFS=, '{print $1,$2,$3; print $4; print ""}' file

将产生您想要的输出

答案3

一些 Perl 方法:

$ perl -pe 's/,([^,]+)$/\n$1\n/' file
AKJHGFGUIKL,OIUYT,KJHBTYUI
98765434567

RTYUIKHGFGH,TYUJI,TGHYJKJKLJKL
6789876

ETRYTUUI,YTYUIL,UIOKJHGFGH
34567898766

-p意味着“逐行读取输入文件并在应用给定的脚本后打印每一行-e”。是s/foo/bar/替换运算符,将替换foobar。在这里,我们匹配一个逗号,后跟一个或多个非逗号字符 ( [^,]+),直到行尾 ( $)。周围的括号([^,]+)将“捕获”任何匹配的内容,因此我们可以将其引用为$1运算符右侧的内容。因此,这将用换行符替换最后一个逗号之后的文本,然后是匹配的文本,然后是另一个换行符。

如果您不能确定第三个逗号是最后一个逗号,您可以这样做:

perl -pe 's/([^,]+,){3}\K(.+)/\n$2\n/' file

或者

perl -pe 's/(.+?,.+?,.+?),(.+)/$1\n$2\n/' file

这里还有一些,只是为了好玩:

perl -pe 's/([^,]+,){3}\K(.+)/\n$2\n/' file
perl -F, -pe '$k=pop(@F); $_=join(",", @F)."\n$k\n"' file
perl -F, -le 'print join ",", @F[0..2],"\n@F[3..$#F]\n"' file

答案4

awk -F, '{print $1, $2, $3,"\n"$4}'

相关内容