【问题标题】:Joining two variables based on unique ID using AWK/SED使用 AWK/SED 基于唯一 ID 连接两个变量
【发布时间】:2012-02-14 12:47:16
【问题描述】:

我有两个变量,它们是逗号分隔的列表。我想通过根据其唯一 ID 附加行来加入这两个变量。

下面的例子:

var1="
id1,data1,data2,data3
id2,data1,data2,data3
id3,data1,data2,data3
id4,data1,data2,data3
"

var 2="
id1,data4,data5,data6
id2,data4,data5,data6
id3,data4,data5,data6
id4,data4,data5,data6
"

output="
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6
"

我在 AWK 方面不是最好的,虽然我可以解密它,但我仍然难以提出命令。如果您能提供帮助,那就太好了!

【问题讨论】:

  • 您需要 sed 或 awk 的任何特殊原因?
  • 不是真的,只是假设这将是使用的工具

标签: unix sed awk ksh


【解决方案1】:

如果你没有设置sedawk,你可以使用join

$ cat in1
id1,data1,data2,data3
id2,data1,data2,data3
id3,data1,data2,data3
id4,data1,data2,data3
x
$ cat in2
id1,data4,data5,data6
id2,data4,data5,data6
id3,data4,data5,data6
id4,data4,data5,data6
y
$ join -t, -j1 in1 in2
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6
$ join -t, -a1 -a2 -j1 in1 in2
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6
x
y

如果您想查看不匹配的行,请使用-a1 -a2 选项,否则不要。

注意文件需要排序,如果还没有排序,可以使用sort命令。

sort in1 > in1.sorted
sort in2 > in2.sorted

【讨论】:

  • 或者这个join -t, <(sort file1) <(sort file2)
  • 这似乎是最简单的方法。尽管我要求使用 SED 或 AWK,但连接似乎要简单得多。我喜欢简单的代码:)
【解决方案2】:

这可能对你有用:

output=$(echo "$var1" | 
sed 's|^\([^,]*,\)\(.*\)|/^\1/s/^[^,]*,\\(.*\\)/\1\2,\\1/|;$a\/^$/d' | 
sed -f - <(echo "$var2"))
echo "$output"
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6

【讨论】:

  • 我的眼睛……我的眼睛……:) +1(只是因为是你和 sed)
【解决方案3】:

使用awk:

#!/usr/bin/awk -f

# Set the Field Separator to "," and Output FS to ","
BEGIN{
        FS=","; OFS="," 
        }

# Store each line of file1 to an array a, indexed at $1        
NR==FNR{
            a[$1]=$0;next 
            } 

# Check if the column 1 of file2 is present in that array. Print if it is.        
($1 in a){  
            print a[$1],$2,$3,$4
            }

测试:

[jaypal:~/Temp] cat f1
id1,data1,data2,data3
id2,data1,data2,data3
id3,data1,data2,data3
id4,data1,data2,data3
[jaypal:~/Temp] cat f2
id1,data4,data5,data6
id2,data4,data5,data6
id3,data4,data5,data6
id4,data4,data5,data6
[jaypal:~/Temp] ./s.awk f1 f2
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6

@kevin 所述,使用 join。这是一个简化版本。

join -t, <(sort file1) <(sort file2)

测试:

[jaypal:~/Temp] join -t, <(sort f1) <(sort f2)
id1,data1,data2,data3,data4,data5,data6
id2,data1,data2,data3,data4,data5,data6
id3,data1,data2,data3,data4,data5,data6
id4,data1,data2,data3,data4,data5,data6

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2018-07-15
    • 2015-12-20
    • 1970-01-01
    • 2013-08-06
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多