根据UNIX中的条件连接两个文件

时间:2018-10-18 08:53:44

标签: shell unix awk sed

我有2个不同的文件,一个文件带有Cust#,另一个文件带有Cusotmer#和名称。我想在两个基于Cust#的文件之间进行比较,并从与cust#匹配的file2中提取这些记录。我知道这在sql中很容易,但是在Unix中该如何做。任何人,任何建议..谢谢大家

文件1:

客户#

1  
2  
3
4
5

file2.txt:

Cust#| ad1 | ad2 | ad3 | ad4 | name1 | name2 | name3 | loc1 | loc2 | loc3 | city1 | city2 | city3 | st1 | st2 | st3 | st4

1|eee|ee|||||||||||city3|st1|st2|st3|st4
8|eee|ee|||||||||||city41|st15|st62|st73|st18
B|eee|ee|||||||||||city32|st51|st52|st53|st88
2|eee|ee|||||||||||city31|st13|st62|st3|st99
3|eee|ee|||||||||||city23|st11|st22|st33|st55

输出。

1|eee|ee|||||||||||city3|st1|st2|st3|st4
2|eee|ee|||||||||||city31|st13|st62|st3|st99
3|eee|ee|||||||||||city23|st11|st22|st33|st55

2 个答案:

答案 0 :(得分:2)

这可能对您有用:

   var radioValue = $("#radioID").val();

使用GNU sed的替代方法:

join -t\| -j1 <(sort file1) <(sort file2)

将第一个文件转换为sed脚本,并在对file2的sed的第二次调用中使用它。

答案 1 :(得分:1)

使用awk:

awk -F\| 'NR==FNR{ids[$1]=1;next}ids[$1]==1' file1 file2

编辑-添加说明:

在解析第一个文件时执行NR == FNR之后的块。它创建一个名为“ ids”的数组。 当awk完成解析第一个文件时,数组为:

ids[1] = 1
ids[2] = 1
ids[3] = 1
ids[4] = 1
ids[5] = 1

调用“ next”以避免执行脚本的其余部分(在解析第一个文件时)

ids[$1]==1

将检查第二个文件的每一行,如果ids [value_inside_first_column]等于1,则打印该行。

这等效于:

awk -F\| '
    NR==FNR{
        ids[$1]=1
    }
    NR!=FNR{
        if(ids[$1]==1){
            print $0
        }
    }'

使用grep很有趣,但我更喜欢awk或join版本:

grep -wF -f file1 file2

grep解决方案适用于您的示例,但不稳定,因为它将打印以下行:

B|eee|ee||||||1|||||city23|st11|st22|st33|st55

请注意,在file1示例中您有多余的空格字符,这会导致意外错误。