我是 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/