Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用另一个文件中的行替换bash中的行_Bash_Join_Replace - Fatal编程技术网

用另一个文件中的行替换bash中的行

用另一个文件中的行替换bash中的行,bash,join,replace,Bash,Join,Replace,我有文件1: sample_1 group_1 sample_2 group_1 sample_3 group_1 sample_4 group_2 sample_5 group_2 sample_6 group_2 sample_7 group_3 sample_8 group_3 sample_9 group_3 和文件2: sample_8 group_3.1 sample_9 group_3.1 我想用文件2第1列的匹

我有文件1:

sample_1    group_1
sample_2    group_1
sample_3    group_1
sample_4    group_2
sample_5    group_2
sample_6    group_2
sample_7    group_3
sample_8    group_3
sample_9    group_3
和文件2:

sample_8    group_3.1
sample_9    group_3.1
我想用文件2第1列的匹配行替换文件1第2列中的行,因此结果是:

sample_1    group_1
sample_2    group_1
sample_3    group_1
sample_4    group_2
sample_5    group_2
sample_6    group_2
sample_7    group_3
sample_8    group_3.1
sample_9    group_3.1
最近的一次是做左连接:
join-a1-j1-o1.1,1.2,2.2您可以使用
awk
脚本按照以下脚本执行此操作:

pax:~> cat file1
sample_1 group_1
sample_2 group_1
sample_3 group_1
sample_4 group_2
sample_5 group_2
sample_6 group_2
sample_7 group_3
sample_8 group_3
sample_9 group_3

pax:~> cat file2
sample_8 group_3.1
sample_9 group_3.1

pax:~> awk -f prog.awk file2 file1
sample_1 group_1
sample_2 group_1
sample_3 group_1
sample_4 group_2
sample_5 group_2
sample_6 group_2
sample_7 group_3
sample_8 group_3.1
sample_9 group_3.1
实际的
awk
脚本如下所示:

NR == FNR { lookup[$1] = $2; next }
NR != FNR && lookup[$1] != "" { print $1" "lookup[$1]; next }
{ print }
第一行只收集给定的第一个文件中的所有查找值,
NR==FNR
技巧将当前输入文件中的行与整个输入文件集中的行进行比较。这些仅在第一个文件中相等

第二行用于后续文件,因为
NR
FNR
不同。它还检查查找是否存在。如果这两个条件都满足,它将使用查找值而不是原始值输出调整后的输入行


第三行只是在不存在查找的地方回显输入行。

这里有一种使用
awk

awk'FNR==NR{a[$1]=$0;next}($1在a中){$0=a[$1]}1'文件2文件1
样本组1
样本2组样本1
样本3组样本1
样本4组样本2
样本5组样本2
样本6第2组
样本7第3组
样本8第3.1组
样本9第3.1组
FNR==NR{…;next}
是一种标准语法,表示仅对第一个输入使用代码块。我们将第一个字段作为散列保存到其中,整行:
a[$1]=$0

下一步是对第二个输入文件执行的,对于file1:
(a中的$1)
是一个条件,表示哈希中是否存在第一个字段。然后
{$0=a[$1]}
表示用该数组的保存行替换该行<代码>1
结尾表示要打印


加入

如果要使用join,可能必须首先获取
file1
的行(这是您当前使用的
-a1
),然后从第二个文件中打印第一次加入的字段。最后再整理一下。下面是命令分组的示例:

(
连接-v1-j1文件1文件2
连接-j1-o 2.1,2.2文件1文件2
)|分类

好的,谢谢。那么我在哪里可以上诉复制品呢?(我在这里的评论中猜测?)我想知道你为什么认为它是重复的,那么也许我可以修改另一个问题中的代码。@Luther_Blissett我将前一个标记为重复,因为上面命令上的各种小更改可以做不同的事情。您可以使用字段1、2、3或整行,在字段存在或行存在时替换。我无意让您难以找到查询的答案,但在连接、合并、排除行时,相同语法有太多几乎重复的内容,这就是为什么我还要添加此答案。您可以看到,这里唯一修改的是与链接帖子相比的条件(以及字段数)。我希望他们是有帮助的,如果链接的帖子不是重复的,那么接受我的道歉,如果是,那么也没关系。记住使用相同的问题,在那里发表评论或编辑它,它肯定会引起人们的注意,也会得到一些帮助。顺便说一句,我在你的许多白色中看到,绿色在哪里?也许你必须投票和/或接受你之前问题中对你有帮助的任何答案。干杯
NR == FNR { lookup[$1] = $2; next }
NR != FNR && lookup[$1] != "" { print $1" "lookup[$1]; next }
{ print }