过滤文件与specift单词linux

时间:2015-05-18 17:51:26

标签: linux bash grep

我的文件中第一列是ID,第二列是选项,如下所示:

$ cat file.txt
 1234;m11
 6758;m11;m14
 8796;mm14
 0303;m11

我需要创建一个ID取决于选项的文件。这就是说:

file_m11.txt => (1234,0303)
file_m11_m14 => (6758)
file_mm14 => (8796)

我尝试使用cat file.txt | grep -w "option" > file_option,但问题是这些文件是互斥的,结果是

file_m11.txt => (1234,0303,*6758*)
file_m11_m14 => (6758)
file_mm14 => (8796,*6758*)

因为我没有这样做,(选项可以更改名称)

2 个答案:

答案 0 :(得分:2)

不确定我是否完全理解了这个问题(见上面的评论),但现在就这样了。

如果您保存以下内容,例如split.awk

{
  a=gensub(/^([^;]+).*/,"\\1",1);
  file=gensub(/[0-9]+;(.*)/,"\\1",1);
  gsub(/;/,"_",file); 
  store[file] = ""store[file]""a","
}
END{
  for( options in store ){
    gsub( /^/, "(", store[options])
    gsub( /,$/, ")", store[options])
    print store[options]  >> "file_"options".txt"
  }
}

然后像这样运行:

awk -f split.awk file.txt

这将创建:

-rw-rw-r-- 1 tink   tink     7 2015-05-19 08:29 file_mm14.txt
-rw-rw-r-- 1 tink   tink    12 2015-05-19 08:29 file_m11.txt
-rw-rw-r-- 1 tink   tink     7 2015-05-19 08:29 file_m11_m14.txt

内容如上所示。

答案 1 :(得分:1)

如果m11;m14是单个“选项”,您可以修改您的grep

grep -P '^\s*\d+;option$' file > file_option

-P使用perl样式正则表达式,这通常更好看,更容易使用。然后正则表达式查找以0或更多空格(或制表符)开头的行,然后是一些数字,分号,然后是您的选项和行的结尾。因此m14m11;m14不匹配,因为该行的开头与模式不匹配,m11将与m11;m14不匹配,因为该行的结尾赢了不匹配。

它不会放置parens或将所有内容放在与示例中相同的行上,但是您对命令的尝试也不会这样做,因此我认为现在实际上并不重要。< / p>