regex - 按特定模式对文本文件中的列重新排序

标签 regex perl sed awk pattern-matching

我是 awk 的新手,一直在努力使它工作。我正在尝试获取“image.list”中的文件列表并从中创建一个“信息”文件。我需要从文件名的中间获取与正则表达式(8-11 位数字长)匹配的字符串,并将该匹配项打印到我的“信息文件”中的指定位置。最后一部分是我无法完成的部分。希望得到一些帮助来解决这个问题。

这是我的测试文件列表:

SURGERY0001275678image1.jpg
SURGERY11134900211image2.jpg
SURGERY19257012image3.jpg
SURGERY273142590image4.jpg

这是我当前的代码:

awk 'BEGIN {print "-----TEST TAG FILE\tENCOUNTERS-----";}
> {print "FILE:  /tmp/imagetest/"$1,"\t","ENCOUNTER: ",($1~/^[0-9]{8,11}$/);}
> END{print "END REPORT";
> }' image.list > upload.tag

这是我当前的输出:

-----TEST TAG FILE      ENCOUNTERS-----
FILE:  /tmp/imagetest/SURGERY0001275678image1.jpg        ENCOUNTER:  0
FILE:  /tmp/imagetest/SURGERY11134900211image2.jpg       ENCOUNTER:  0
FILE:  /tmp/imagetest/SURGERY19257012image3.jpg          ENCOUNTER:  0
FILE:  /tmp/imagetest/SURGERY273142590image4.jpg         ENCOUNTER:  0
END REPORT

我需要它显示的是“ENCOUNTER:”之后文件名中间的8-11位数字。到目前为止,我尝试过的所有内容都输出整个文件名或“0”。

我可能偏离了路线,所以我很乐意从你们这些专家那里得到一些帮助!

最佳答案

重新使用您现有的代码:

$ awk '
BEGIN {
    print "-----TEST TAG FILE\tENCOUNTERS-----";
}
match($0,/[^0-9]+([0-9]+)[^0-9]+/,ary) {
    print "FILE:  /tmp/imagetest/"$1,"\t","ENCOUNTER:"ary[1]
}
END { 
    print "END REPORT";
}' testfile

测试:

$ cat testfile
SURGERY0001275678image1.jpg
SURGERY11134900211image2.jpg
SURGERY19257012image3.jpg
SURGERY273142590image4.jpg

$ awk '
> BEGIN {
>     print "-----TEST TAG FILE\tENCOUNTERS-----";
> }
> match($0,/[^0-9]+([0-9]+)[^0-9]+/,ary) {
>     print "FILE:  /tmp/imagetest/"$1,"\t","ENCOUNTER:"ary[1]
> }
> END { 
>     print "END REPORT";
> }' testfile
-----TEST TAG FILE      ENCOUNTERS-----
FILE:  /tmp/imagetest/SURGERY0001275678image1.jpg        ENCOUNTER:0001275678
FILE:  /tmp/imagetest/SURGERY11134900211image2.jpg       ENCOUNTER:11134900211
FILE:  /tmp/imagetest/SURGERY19257012image3.jpg          ENCOUNTER:19257012
FILE:  /tmp/imagetest/SURGERY273142590image4.jpg         ENCOUNTER:273142590
END REPORT

正如 Ed Morton 在评论中所建议的那样,将数组参数用于 match() 此解决方案仅适用于 GNU awk。

关于regex - 按特定模式对文本文件中的列重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17116601/

相关文章:

regex - Linux : Replace key-value pair, 值包含文件路径

c# - C# 中的替换和 Java 中的 replaceAll

regex - 具有负前瞻的 Perl 正则表达式表现出意外

linux - 如何在unix中仅替换>和<之间的一个换行符

database - Perl:在磁盘上存储一个巨大的散列有问题吗?

perl - 文件打开错误 - 全局符号 "$infilename"需要明确的包名

linux - 使用 sed 替换字符串中的版本号

javascript - 正则表达式 - 选择不是标签名称或属性的单词

Regexp::Debugger Perl 模块似乎不能在另一个 Perl 模块中工作

ruby - ruby 正则表达式中的引号被误解为字符串的开头