首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按特定模式对文本文件中的列进行重新排序

按特定模式对文本文件中的列进行重新排序
EN

Stack Overflow用户
提问于 2013-06-15 04:16:05
回答 6查看 283关注 0票数 2

我是awk的新手,一直在拼命工作。我正在尝试获取"image.list“中的文件列表,并从中创建一个"info”文件。我需要从文件名中间抓取匹配正则表达式( 8-11位数字)的字符串,并将匹配的字符串打印到我的"info file“中的指定位置。最后那部分是我很难完成的部分。希望你能帮我解决这个问题。

下面是我的测试文件列表:

代码语言:javascript
运行
复制
SURGERY0001275678image1.jpg
SURGERY11134900211image2.jpg
SURGERY19257012image3.jpg
SURGERY273142590image4.jpg

下面是我当前的代码:

代码语言:javascript
运行
复制
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

这是我当前的输出:

代码语言:javascript
运行
复制
-----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

我需要它显示的是文件名中间“遇到:”后的8-11位数字。到目前为止,我尝试过的所有东西要么输出整个文件名,要么输出"0“。

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-06-15 04:34:38

重用您现有的代码:

代码语言:javascript
运行
复制
$ 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

测试:

代码语言:javascript
运行
复制
$ 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在评论中建议的那样,使用数组参数来匹配()此解决方案仅适用于GNU awk。

票数 5
EN

Stack Overflow用户

发布于 2013-06-15 19:28:00

下面是常用的awk函数" extract ()“,用于提取与RE匹配的字符串:

代码语言:javascript
运行
复制
awk -v re='<whatever>' '
function extract(str,regexp)
{ RMATCH = (match(str,regexp) ? substr(str,RSTART,RLENGTH) : "")
  return RSTART
}
extract($0,re) { print RMATCH }
'

只需将"re“设置为您想要匹配的任何内容,例如:

代码语言:javascript
运行
复制
$ cat file
SURGERY0001275678image1.jpg
SURGERY11134900211image2.jpg
SURGERY19257012image3.jpg
SURGERY273142590image4.jpg

$ awk -v re='[[:digit:]]{8,11}' '
function extract(str,regexp)
{ RMATCH = (match(str,regexp) ? substr(str,RSTART,RLENGTH) : "")
  return RSTART
}
extract($0,re) { print RMATCH }
' file
0001275678
11134900211
19257012
273142590

或者,如果您更喜欢使用相同的match()+substr()方法的更具体的解决方案:

代码语言:javascript
运行
复制
$ awk '
BEGIN{ print "-----TEST TAG FILE\tENCOUNTERS-----" }
{ printf "FILE:  %s\tENCOUNTER: %d\n", $0, (match($0,/[[:digit:]]{8,11}/) ? substr($0,RSTART,RLENGTH) : 0) }
END{ print "END REPORT" }
' file
-----TEST TAG FILE      ENCOUNTERS-----
FILE:  SURGERY0001275678image1.jpg      ENCOUNTER: 1275678
FILE:  SURGERY11134900211image2.jpg     ENCOUNTER: 11134900211
FILE:  SURGERY19257012image3.jpg        ENCOUNTER: 19257012
FILE:  SURGERY273142590image4.jpg       ENCOUNTER: 273142590
END REPORT

请注意,如果您的所有文件名都遵循相同的模式,并且在您关心的8-11位流之前没有其他数字,那么您可以使用[[:digit:]]+作为匹配RE,而不是显式地指定范围[[:digit:]]{8,11}

票数 2
EN

Stack Overflow用户

发布于 2013-06-15 04:18:35

试试这个:

代码语言:javascript
运行
复制
$ cat input
SURGERY0001275678image1.jpg
SURGERY11134900211image2.jpg
SURGERY19257012image3.jpg
SURGERY273142590image4.jpg

$ awk '{split($1,a,/[[:alpha:]]*/);print a[2]}' input
0001275678
11134900211
19257012
273142590
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17116601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档