Shell 基于第一个字段匹配行并合并第二个字段

Shell 基于第一个字段匹配行并合并第二个字段,shell,sed,awk,Shell,Sed,Awk,我想使用awk、sed或类似的方法合并来自两个文件的第二个字段的条目 文件0: string:data:moredata 文件1: string:random:moredata 如果文件0中的第一个字段string在文件1中有匹配的条目,则打印 $random:$data 选择字段似乎很简单: $ awk -F':' '{print $2}' filename 需要匹配行并打印匹配列$2join-在公共字段上连接两个文件的行 因此,请执行awk操作,只打印数据和“key”字段。然后执行类

我想使用awk、sed或类似的方法合并来自两个文件的第二个字段的条目

文件0:

string:data:moredata
文件1:

string:random:moredata
如果文件0中的第一个字段string在文件1中有匹配的条目,则打印

$random:$data
选择字段似乎很简单:

$ awk -F':' '{print $2}' filename

需要匹配行并打印匹配列$2

join-在公共字段上连接两个文件的行


因此,请执行awk操作,只打印数据和“key”字段。然后执行类似的join命令:
join-11-21file1file2>join.dat
join-join公共字段上两个文件的行

因此,请执行awk操作,只打印数据和“key”字段。然后执行类似以下操作的join命令:
join-11-21file1file2>joined.dat
这个如何-

awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
执行:

[jaypal~/Temp]$ cat file1
string:data:moredata

[jaypal~/Temp]$ cat file2
string:random:moredata

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:data
[jaypal~/Temp]$ cat file1
string:data:moredata
man:woman:child

[jaypal~/Temp]$ cat file2
man:random:moredata
string:woman:child

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:woman
woman:data
在这个解决方案中,我们将file1的整个记录加载到第1列索引的数组中。我们在下一个文件中快速检查列1是否存在。如果是,则执行print语句

阴性试验:

[jaypal~/Temp]$ cat file1
string:data:moredata

[jaypal~/Temp]$ cat file2
string:random:moredata

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:data
[jaypal~/Temp]$ cat file1
string:data:moredata
man:woman:child

[jaypal~/Temp]$ cat file2
man:random:moredata
string:woman:child

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:woman
woman:data
为了补充说明,NR和FNR是awk的内置变量。NR给出行号,在两个文件上循环时不会重置为0。相反,FNR也是一个行号,当第二个文件启动时,它会重置为0。因此,这允许我们将文件1存储到数组中,因为该操作仅在NR==FNR时执行。一旦这个条件变为false,就意味着第二个文件已经启动,下一个模式操作语句开始执行

这个怎么样-

awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
执行:

[jaypal~/Temp]$ cat file1
string:data:moredata

[jaypal~/Temp]$ cat file2
string:random:moredata

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:data
[jaypal~/Temp]$ cat file1
string:data:moredata
man:woman:child

[jaypal~/Temp]$ cat file2
man:random:moredata
string:woman:child

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:woman
woman:data
在这个解决方案中,我们将file1的整个记录加载到第1列索引的数组中。我们在下一个文件中快速检查列1是否存在。如果是,则执行print语句

阴性试验:

[jaypal~/Temp]$ cat file1
string:data:moredata

[jaypal~/Temp]$ cat file2
string:random:moredata

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:data
[jaypal~/Temp]$ cat file1
string:data:moredata
man:woman:child

[jaypal~/Temp]$ cat file2
man:random:moredata
string:woman:child

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2
random:woman
woman:data

为了补充说明,NR和FNR是awk的内置变量。NR给出行号,在两个文件上循环时不会重置为0。相反,FNR也是一个行号,当第二个文件启动时,它会重置为0。因此,这允许我们将文件1存储到数组中,因为该操作仅在NR==FNR时执行。一旦这个条件变为false,就意味着第二个文件已经启动,下一个模式操作语句开始执行

sed
解决方案可能适合您:

# cat file1
string0:data1:moredata
string2:data3:moredata
string4:data5:moredata
string6:data7:moredata
string8:data9:moredata
# cat file2
string0:random1:moredata
string2:random3:moredata
string4:random5:moredata
cat file1 - <<<"EOF" file2 | 
sed '1,/^EOF/{H;d};G;s/^\([^:]*:\)\([^:]*:\).*\1\([^:]*\).*/$\2$\3/p;d'
$random1:$data1
$random3:$data3
$random5:$data5
#cat文件1
string0:data1:moredata
string2:data3:moredata
string4:data5:moredata
字符串6:data7:moredata
string8:data9:moredata
#cat文件2
string0:random1:moredata
string2:random3:moredata
string4:random5:moredata

cat file1-此
sed
解决方案可能适合您:

# cat file1
string0:data1:moredata
string2:data3:moredata
string4:data5:moredata
string6:data7:moredata
string8:data9:moredata
# cat file2
string0:random1:moredata
string2:random3:moredata
string4:random5:moredata
cat file1 - <<<"EOF" file2 | 
sed '1,/^EOF/{H;d};G;s/^\([^:]*:\)\([^:]*:\).*\1\([^:]*\).*/$\2$\3/p;d'
$random1:$data1
$random3:$data3
$random5:$data5
#cat文件1
string0:data1:moredata
string2:data3:moredata
string4:data5:moredata
字符串6:data7:moredata
string8:data9:moredata
#cat文件2
string0:random1:moredata
string2:random3:moredata
string4:random5:moredata

cat file1-不确定如何仅使用join匹配行,因为它们可能没有被排序,而且file0可能有更少的行。我认为更少的行根本不重要。我想这就像db表一样。(我只使用过一次
join
,那是几年前的事了。)
man
页面的排序不清楚。一部分表示您必须排序,另一部分表示
join
可以为您排序。我想需要进行实验。不确定如何仅使用join匹配行,因为它们可能不会被排序,而且file0可能会有更少的行。我认为更少的行根本不重要。我想这就像db表一样。(我只使用过一次
join
,那是几年前的事了。)
man
页面的排序不清楚。一部分表示您必须排序,另一部分表示
join
可以为您排序。我想这需要实验。做得很好!你应该开始用SED一行写一本电子书。我还没有弄清楚G、H和其他疯狂的东西。:)+1不需要
$
,希望传递不同的字段。谢谢你的反馈。做得好!你应该开始用SED一行写一本电子书。我还没有弄清楚G、H和其他疯狂的东西。:)+1不需要
$
,希望传递不同的字段。感谢您的反馈。