首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk +根据文件中的值对文件进行排序,并写入两个不同的文件

awk +根据文件中的值对文件进行排序,并写入两个不同的文件
EN

Stack Overflow用户
提问于 2010-06-16 14:11:59
回答 2查看 258关注 0票数 0

我在文件中有右眼和左眼的file_test值,如何通过awk将file_test分隔为file1file2,以便将相等的值写入file1,将不同的值写入file2,如下面的示例所示

file_test是:

代码语言:javascript
复制
NAME: jim 
LAST NAME: bakker
right eye: >|5|< 
left eye VALUE: >|5|< 
NAME: Jorg 
LAST NAME: mitchel
right eye: >|3|< 
left eye VALUE: >|5|< 
NAME: jimmy  
LAST NAME: kartter
right eye: >|6|< 
left eye VALUE: >|5|< 
NAME: david  
LAST NAME: kann
right eye: >|9|< 
left eye VALUE: >|9|< 

file1应为:

代码语言:javascript
复制
NAME: jim  
LAST NAME: bakker
right eye: >|5|< 
left eye VALUE: >|5|< 
NAME: david  
LAST NAME: kann
right eye: >|9|< 
left eye VALUE: >|9|< 

file2应为:

代码语言:javascript
复制
NAME: Jorg  
LAST NAME: mitchel
right eye: >|3|< 
left eye VALUE: >|5|< 
NAME: jimmy  
LAST NAME: kartter
right eye: >|6|< 
left eye VALUE: >|5|<
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-16 19:41:19

我会使用Perl来完成以下操作:

代码语言:javascript
复制
    open my $f, "<", "file_input";
    open my $file1, ">", "file1";
    open my $file2, ">", "file2";
    while (! eof($f)) {
        my $person; $person .= <$f> for (1..4);  # read 4 lines
        my ($right) = ($person =~ /^right.*?(\d+)/m);
        my ($left) = ($person =~ /^left.*?(\d+)/m);
        my $file = ($right == $left) ? $file1 : $file2;
        print $file $person;
    }
    close $f;
    close $file1;
    close $file2
票数 0
EN

Stack Overflow用户

发布于 2010-06-16 21:54:15

代码语言:javascript
复制
awk -F: '/^NAME:/ && buff {
  say(buff, eyes); buff = null 
  split(null, eyes) # use delete eyes if supported
  }
{ 
  buff = buff ? buff RS $0 : $0
  /eye/ && eyes[$NF]
  }
END { say(buff, eyes) }
func say(b, e) {
  # length(array) is not portable
  print b > (length(e) > 1 ? "file2" : "file1")
  }' file_test
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3051067

复制
相关文章

相似问题

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