我有一个 .txt 文档,其中包含数千个具有相似布局的字符串,但其中一些行包含我不想要的附加信息。
这是一个例子:
202212_08,ABC123/A1234,AB,,C123
202212_08,CDEF1233/A5678,FG,,C345
我希望输出如下:
20221208,ABC123,C123
20221208,CDEF1233,C344
我尝试过使用正则表达式,但不断收到错误并且输出为空。感谢您的帮助。
答案1
和sed
:
$ sed -e 's:/.*,:,:' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
这会将从/
行中第一个字符到,
行中最后一个字符的所有内容替换为单个,
字符。
但是,当输入数据包含多个字段时,通常最好使用 awk 或 perl,因为它们允许您单独操作和/或打印每个字段。
例如,以下 awk 脚本使用内置函数/.*
从每个输入行的第二个字段中删除,然后打印第一个 ( )、第二个 ( ) 和最后一个 ( ) 字段。sub()
$1
$2
$NF
$ awk -F, -vOFS=, '{sub(/\/.*/,"",$2); print $1, $2, $NF}' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
或使用 perl:
$ perl -F, -lane '$F[1] =~ s:/.*::; print join(",",@F[0,1,-1])' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
该-F,
选项设置字段分隔符(类似于 awk),该-a
选项使输入自动拆分为名为 的数组@F
。 -l
打开 Perl 对行结尾的自动处理(例如换行符或\n
)并使-n
Perl 像 一样工作sed -n
。-e
告诉 perl 下一个参数是要执行的脚本。
请注意,perl 数组索引从零开始,而不是从一开始,数组$F[1]
的第二个元素也是如此@F
,数组切片@F[0,1,-1]
是数组的第一个、第二个和最后一个元素。