我的文件中第一列是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*)
因为我没有这样做,(选项可以更改名称)
答案 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或更多空格(或制表符)开头的行,然后是一些数字,分号,然后是您的选项和行的结尾。因此m14
与m11;m14
不匹配,因为该行的开头与模式不匹配,m11
将与m11;m14
不匹配,因为该行的结尾赢了不匹配。
它不会放置parens或将所有内容放在与示例中相同的行上,但是您对命令的尝试也不会这样做,因此我认为现在实际上并不重要。< / p>