过滤包含特定单词的文件 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
内容如上。
我有一些文件,其中第一列是一个 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 -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
内容如上。