我有一些文件,其中第一列是 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
因为行的末尾不匹配。
它不会像您的示例中那样放置括号或将所有内容放在同一行上,但是您对命令的尝试也不会这样做,所以我假设现在这实际上并不重要。