过滤包含特定单词的文件 linux

filter file with specift words linux

我有一些文件,其中第一列是一个 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*)

因为我这样做是为了不发生这种情况,(选项可以更改名称)

如果 m11;m14 是单个 "option" 你可以像

这样修改你的 grep
grep -P '^\s*\d+;option$' file > file_option

-P 使用 perl 风格的正则表达式,这种正则表达式通常更美观且更易于使用。然后正则表达式查找以 0 个或多个空格(或制表符)开头的行,然后是一些数字、分号,然后是您的选项和行尾。所以 m14 不会匹配 m11;m14 因为行的开头不匹配模式,并且 m11 不会匹配 m11;m14 因为行的结尾赢了'匹配。

它不会像您的示例那样将括号或所有内容放在同一行,但是您对命令的尝试也不会这样做,所以我假设现在这并不重要.

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

如果您将以下内容另存为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

内容如上。