【问题标题】:Using file1 as an Index to search file2 when file1 contains extra informations当 file1 包含额外信息时,使用 file1 作为索引来搜索 file2
【发布时间】:2016-02-09 22:44:55
【问题描述】:

正如您在我处理两个文件的标题中看到的那样。她就是这个样子的例子。

文件1:

名称(附加信息由名称与制表符隔开)

Peter Schwarzer<tab>Best friend of mine

文件2:

名称(后跟一个用制表符隔开的浮点数)

Peter Schwarzer<tab>1456

所以我想做的是使用file1 one 作为搜索file2 的索引。如果名称匹配,则应将其写入 file3,其中应包含名称,后跟来自 file2 的浮点数,然后是来自 file1 的附加信息。 所以 file3 应该是这样的:

Peter Schwarzer<tab>1456<tab>Best friend of mine 

(由制表符分隔的所有内容)

我尝试使用 grep -f 从文件中读取模式,但没有附加信息。那么有什么方法可以使用 grep 获得所需的结果,或者 AWK 是答案吗?

提前致谢, 朱利安

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    试试这条线,我没有测试,但应该去:

    awk -F'\t' -v OFS="\t" 'NR==FNR{n[$1]=$2;next}$1 in n{print $0,n[$1]}' file1 file2 > file3
    

    【讨论】:

    • 谢谢。这就是我正在寻找的:)
    【解决方案2】:

    试试这个 awk one 班轮!

    awk -v FS="\t" -v OFS="\t" 'FNR==NR{ A[$1]=$2; next}$1 in A{print $0,A[$1];}' file1.txt  file2.txt > file3.txt
    

    【讨论】:

    • @JFS31 我得快点回答!!
    【解决方案3】:

    对我来说,这看起来像是 join 的工作:

    join -t '\t' file1 file2
    

    这假设 file1file2 已排序。如果没有,请先排序:

    sort -o file1 file1
    sort -o file2 file2
    join -t '\t' file1 file2
    

    如果您无法修改 file1file2(如果您需要将它们保留为原始的未排序状态),请使用临时文件:

    tmpfile=/tmp/tf$$
    sort file1 > $tmpfile
    sort file2 | join -t '\t' $tmpfile -
    

    如果join 说“非法制表符规范”,您必须使用join -t ' ' 在单引号之间键入实际制表符(并且根据您的外壳,您可能必须在此之前使用 control-V标签)。

    【讨论】:

    • 感谢您提供这个额外的想法。以前从未尝试过加入:)
    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2017-09-07
    • 2016-02-20
    • 2015-08-03
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多