Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
如何在unix shell中使用awk将一个文件中的数据替换为第二个文件中的更新数据?_Unix - Fatal编程技术网

如何在unix shell中使用awk将一个文件中的数据替换为第二个文件中的更新数据?

如何在unix shell中使用awk将一个文件中的数据替换为第二个文件中的更新数据?,unix,Unix,假设我有两个文件,文件1包含原始数据,而最近创建的文件2更新了需要替换到文件1中的某些数据的值 下面是包含10000行数据的文件1的格式示例,如下所示: 1000001 aaaaaaa aaaaaaa 123 1000002 aaaaaab aaaaaab 123 . . . 1000503 xxxxxxa xxxxxxa 123 . . . 1010000 zzzzzzl zzzzzzl 123 文件2包含1054行,更新值的格式与文件1相同,但其中许多不是连续的。例如,文件2中第10005

假设我有两个文件,文件1包含原始数据,而最近创建的文件2更新了需要替换到文件1中的某些数据的值

下面是包含10000行数据的文件1的格式示例,如下所示:

1000001 aaaaaaa aaaaaaa 123
1000002 aaaaaab aaaaaab 123
.
.
.
1000503 xxxxxxa xxxxxxa 123
.
.
.
1010000 zzzzzzl zzzzzzl 123
文件2包含1054行,更新值的格式与文件1相同,但其中许多不是连续的。例如,文件2中第1000503行的内容如下:

1000503 xxxxxxb xxxxxxb 245

这将使用
join
awk
完成,假设文件按键顺序排列:

join -a1 -j1 file1 file2 \
    | awk '{ if (NF > 4) print $1, $5, $6, $7; else print $0 }'
这项工作分两步完成

合并文件 首先,
join
获取两个具有公共列(在本例中为前导数字列)的文本文件,并像数据库连接一样“连接”它们。默认情况下,它会打印两个文件中出现密钥的所有行<代码>-j1告诉它在第一个字段加入
-a1
告诉它打印文件1中的所有行,即使它们在文件2中没有对应的行

join
对两个文件都有按键排序的限制

这将生成文件1的副本,其中还包括来自文件2的匹配行,如下所示:

1000001 aaaaaaa aaaaaaa 123
1000002 aaaaaab aaaaaab 123
.
.
.
1000503 xxxxxxa xxxxxxa 123 xxxxxxb xxxxxxb 245
.
.
.
1010000 zzzzzzl zzzzzzl 123
分割田地 我们现在有一个问题:匹配的行包含来自两个文件的数据。但这不是我们想要的:我们希望它替换文件1中的数据。我找不到一种方法让
加入
自己做这件事,所以
awk
来拯救

Awk代码非常简单。如果字段数(NF变量)大于4,则有一条连接线;在这种情况下,打印字段1、5、6和7。否则,打印整个原始行(因为它没有连接)

这将发出每个未修改的不匹配行,以及每个匹配行的file2版本。

使用sed:

join -a 1 in1 in2 | sed 's/^\([0-9]*\) [^ ]* [^ ]* [^ ]* /\1 /'

你真的要用awk来做这个吗?不,任何对我有用的东西都可以。我不是程序员,所以我只需要一种快速更新数据的方法,而不是打开两个文件并逐行执行。既然我不是一个程序员,你能解释一下命令内部的情况吗?谢谢