2017-02-27 35 views
2

我的问题涉及: 我有一个文件:一个文件和排序的grep匹配几个输出文件

FileA: 
Peter Programmer 
Frank Chemist 
Charles Physicist 
John Programmer 
Alex Programmer 
Harold Chemist 
George Chemist 

我现在得到了FILEA所有作业信息,并将其保存到一个唯一列表( FILEB)。

FileB: 
Programmer 
Chemist 
Physcist 

(假设FILEA的推移和与更多的人,冗余信息)

我想现在要做的就是从FILEA让所有的作业类,并为每个作业 - 一个新的文件类,以便在年底我有:

FileProgrammer 
Peter Programmer 
John Programmer 
Alex Programmer 

FileChemist 
Frank Chemist 
Harold Chemist 
George Chemist 

FilePhysicist 
Charles Physicist 

我想grep作业名称从作业文件列表模式和创建中存在的其他原始文件中的每个作业名称的新文件。

所以实际上,我在列表中有56个唯一元素,原始文件有几列(制表符分隔)。

我做什么,到目前为止是这样的:

cut -f2 | sort | uniq > Jobs 
grep -f(tr '\t' '\n' < "${Jobs}") "${FileA}" > FileA+"${Jobs}" 

我认为每一个新的模式相匹配的新文件将被创建,但我意识到,这将刚才复制的文件,因为没有增量或迭代文件创建。

由于我对bash的经验尚未深入发展,所以我希望你们能帮助我。提前致谢。

@Update: 输入文件看起来是这样的:

4 23454 22110 Direct + 3245 Corrected 
3 21254 12110 Indirect + 2319 [email protected] 
11 45233 54103 Direct - 1134 Not-Corrected 

从本质上讲,我想拥有的修正是在一个文件中7列中的状态命名修正和一切,所以列的每一个独特的价值7.

+0

你为什么要用'grep'来做这个?你可以使用awk吗? – Inian

+0

当然,我可以使用awk - 我只是不熟悉awk在循环上下文中的功能。我尝试了一些awk循环,但有些失败。 – chrys

+0

用'Awk'试一下我的答案 – Inian

回答

1

你可以用grep做一个循环中:

for i in $(cat FileB); do grep $i$ FileA >> File$i; done 

注意,在你的问题的FILEA你写“Physicis t“,并在FileB中写入”Physcist“,所以它们不匹配。无论如何,如果你把它们都写得恰到好处,上面的命令将起作用。

+0

谢谢,这条线路运行得非常好。对不起,错字。唯一的事情是_grep_在匹配模式时似乎很粗糙。例如,如果工作是化学生物化学家,_grep_会将其与其他化学家一起存档,而不会创建另一个化学家 - 生物化学家档案。任何进一步的建议如何纠正?我看到_Awk_被提出,但我很难理解_Awk_代码。 – chrys

+0

@chrys:什么部分,你不明白?试图解释那里的每一点。 – Inian

+0

@chrys我编辑了这个命令来强制为了避免这种情况而对字符串的末尾进行grepped。检查它现在是否有效。 –

2

答案渴望的需要awk中,这里是你如何做到这一点,

awk '{unique[$2]=(unique[$2] FS $1)}\ 
END {for (i in unique) { \ 
     len=split(unique[i],temp); \ 
     for (j=1;j<=len;j++) print temp[j],i > "File"i".txt"} }' \ 
file 

的想法是创建一个哈希地图,与unique[$2]=(unique[$2] FS $1),字面意思是,把$2作为用于阵列unique和索引具有值从$1所附,所以在输入文件的每行处理的结束,该阵列看起来像这样,

# <key> <value(s)> 
Chemist Frank Harold George 
Physicist Charles 
Programmer Peter John Alex 

END子句在处理完所有行后执行,因此从构造的数组中使用split()函数在单个whistespace上分割,我们将数组值的内容存储到数组temp,并且len包含数字分裂后产生的元素。

为每个散列索引和每个拆分元素打开一个循环,打印这些值并将其存储在文件中。

+0

谢谢伊莲。快速提问:您的_Awk_脚本假定要搜索的文件仅包含每行一个名称,是否正确?我只是以此为例,但实际上我有一个7列宽的文件,可以通过_grep_或_awk_进行“排序”。如果我创建一个哈希映射,我将不得不创建一个阵列的散列,每个键被分配到一个线,这将是一个数组表示正确的?文件示例:'27 Hatfield Peter London 4 8 Programmer' - Tab是分隔符。 – chrys

+0

提供您的实际输入的问题。 – Inian

相关问题