grep在一个文件上,并匹配几个输出文件

时间:2017-02-27 10:38:56

标签: bash loops awk grep

我的问题涉及以下问题: 我有文件:

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

我现在从FileA获取了所有作业信息并将其保存到唯一列表(FileB)。

  FileB:
Programmer
Chemist
Physcist

(假设FileA继续使用更多人和冗余信息)

我现在要做的是从FileA获取所有作业类,并为每个Job-Class创建一个新文件,以便最终我有:

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    Paused-@2
11  45233   54103   Direct  -   1134    Not-Corrected

基本上,我希望在Corrected第7列中具有状态的所有内容都位于名为correct的文件中,因此对于第7列的每个唯一值都是如此。

2 个答案:

答案 0 :(得分: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子句,因此从构造的数组中,使用在单个whistespace上拆分的split()函数,我们将数组值的内容存储到数组templen包含拆分后产生的元素数。

每个哈希索引的循环以及每个分割元素,这些值将被打印并存储在文件中。

答案 1 :(得分:1)

您可以在循环中使用var positions = Array<Dictionary<String,String>>() positions.append(["longitude":String(location.coordinate.longitude), "latitude":String(location.coordinate.latitude), "time":String(Int64(location.timestamp.timeIntervalSince1970 * 1000.0))]) positions.append(["longitude":String(location.coordinate.longitude), "latitude":String(location.coordinate.latitude), "time":String(Int64(location.timestamp.timeIntervalSince1970 * 1000.0))]) //Now set this positions array with positions key in params dictionary let params: Dictionary<String, Any> = ["hash":"asdh832","positions": positions] let data = try JSONSerialization.data(withJSONObject: params , options: []) let dataString = String(data: data,encoding: String.Encoding.utf8)! 执行以下操作:

grep

请注意,在您的问题的FileA中,您写了&#34;物理学家&#34;在FileB中你写了#34; Physcist&#34;,所以他们不会匹配。无论如何,如果你正确地写了两个,上面的命令就可以了。