带有特定单词 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*)

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

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

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

内容如上所示。

如果m11;m14是一个"选项",你可以像修改你的grep一样

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

-P使用perl风格的正则表达式,它通常看起来更好看,更容易使用。 然后,正则表达式查找以 0 个或多个空格(或制表符)开头的行,然后用一些数字来表示分号,然后是您的选项和行尾。 因此,m14不会匹配m11;m14,因为行的开头与模式不匹配,m11不会匹配m11;m14因为行的末尾不匹配。

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

相关内容

  • 没有找到相关文章

最新更新