John, 1234567
Bob, 2839211
Alex, 2817821
Mary, 9371281
我目前正在尝试使用sed检索第二列的最后四个数字并将其作为第一列输出,因此输出应该如下所示:
John, 4567
Bob, 9211
Alex, 7821
Mary, 1281
这是我的命令:
's/\(.*,\)\(.*\)//'
,我认为这个命令匹配了第一列直到逗号和第二列直到结尾,但我不确定如何继续。John, 1234567
Bob, 2839211
Alex, 2817821
Mary, 9371281
我目前正在尝试使用sed检索第二列的最后四个数字并将其作为第一列输出,因此输出应该如下所示:
John, 4567
Bob, 9211
Alex, 7821
Mary, 1281
's/\(.*,\)\(.*\)//'
,我认为这个命令匹配了第一列直到逗号和第二列直到结尾,但我不确定如何继续。如果您熟悉 awk
,请尝试以下操作。这是在 GNU awk
中使用示例测试的。
awk 'BEGIN{FS=OFS=", "} {$2=substr($2,length($2)-3)} 1' Input_file
说明:为上述内容添加详细解释。
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section of this program from here.
FS=OFS=", " ##Setting FS and OFS to comma space here.
}
{
$2=substr($2,length($2)-3) ##Getting last 4 digits now in 2nd field here.
}
1 ##printing current edited/non-edited line.
' Input_file ##Mentioning Input_file name here.
第二种解决方案:如果你的第二列可能是数字和其他非数字混合的情况下,可以使用以下方法。
awk 'BEGIN{FS=OFS=", "} {gsub(/[^0-9]+/,"",$2);$2=substr($2,length($2)-3)} 1' Input_file
说明:为上述内容添加详细解释。
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section of this program from here.
FS=OFS=", " ##Setting FS and OFS to comma space here.
}
{
gsub(/[^0-9]+/,"",$2) ##Globally substituting everything apart from digits with NULL in 2nd field.
$2=substr($2,length($2)-3) ##getting last 4 digits now in 2nd field here.
}
1 ##printing current edited/non-edited line.
' Input_file ##Mentioning Input_file name here.
您可以使用
sed 's/^\([^,]*\), *[0-9]*\([0-9]\{4\}\).*/\1, \2/' file
查看在线演示。
详情
^
- 字符串的开头\([^,]*\)
- 第1组:除逗号以外的任何零个或多个字符, *
- 逗号和零个或多个空格[0-9]*
- 零个或多个数字\([0-9]\{4\}\)
- 第2组:四个数字.*
- 其余部分的行\1, \2
- 替换为:第1组、,
、空格和第2组的值。只需捕获每行的最后四个数字并删除任何前面的数字:
$ sed 's/[0-9]*\([0-9]\{4\}\)$/\1/' input.txt
John, 4567
Bob, 9211
Alex, 7821
Mary, 1281
sed
版本,可以进行一些清理,如下所示:sed -E 's/[0-9]*([0-9]{4})$/\1/' input.txt
和KamilCuk的回答类似,但使用了POSIX字符类并将数字锚定以便移除:
sed 's/, [[:digit:]]\{3\}/, /'
如果文件格式只是<仅文本字母数字>, <7位数字>
,您可以删除前3个数字:
sed 's/[0-9][0-9][0-9]//'
sed 's/[0-9]\{3\}//'
。 - fpmurphy