Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
Linux 在unix上合并文件和数据。在现有文件中正确合并并更新和插入_Linux_Shell_Unix_Awk_Sed - Fatal编程技术网

Linux 在unix上合并文件和数据。在现有文件中正确合并并更新和插入

Linux 在unix上合并文件和数据。在现有文件中正确合并并更新和插入,linux,shell,unix,awk,sed,Linux,Shell,Unix,Awk,Sed,我有以下文件。我想根据文件的第一个字段合并文件 File1 a~1~2~3~4 b~4~6~7~8 c~8~9~10~11 File1是源文件,我已经收到file2和file3 File2 a~5~6~3~4 b~4~6~7~8 d~9~11~12~13 File3 a~51~61~31~41 b~41~62~72~82 e~11~12~13~14 因此,File1记录会根据我们收到的最新文件进行更新。这里File3是最新的文件。因此,对于具有第一个字段的记录,将使用文件3中的值更新

我有以下文件。我想根据文件的第一个字段合并文件

File1

a~1~2~3~4
b~4~6~7~8
c~8~9~10~11
File1是源文件,我已经收到file2和file3

File2

a~5~6~3~4
b~4~6~7~8
d~9~11~12~13

File3

a~51~61~31~41
b~41~62~72~82
e~11~12~13~14
因此,File1记录会根据我们收到的最新文件进行更新。这里File3是最新的文件。因此,对于具有第一个字段的记录,将使用文件3中的值更新字段a。以c开头的记录在文件2和文件3中没有更新,因此将保持不变。文件3中的记录e是新的,因此添加到文件1中。那么文件1的最终内容是什么呢

a~51~61~31~41
c~8~9~10~11
b~41~62~72~82
d~9~11~12~13
e~11~12~13~14
首先,我试图从所有文件中获取公共记录,但下面的命令仅从2个文件中提取公共记录

awk -F"~" 'NR==FNR {a[$1]=$1; next}$1 in a {print $0}' file1 file2
我正在做更多的工作

cat file3 file2 file1 |sort -u -t~ -k1,1
a~51~61~31~41
b~41~62~72~82
c~8~9~10~11
d~9~11~12~13
e~11~12~13~14
说明:

从file3打开到file1,然后使用unique并根据第一列对其进行排序。列分隔符定义为“~”

此awk将工作:

awk -F'~' '{line[$1]=$0} END {for (key in line) print line[key]}' File{1,2,3}
每个具有特定键的新记录都将替换之前的记录

输出可能无法排序。管道进入
排序
,或者如果使用GNU awk,则将其添加到循环之前的结束块:

PROCINFO["sorted_in"] = "@ind_str_asc"

添加您试图使用哪种标准更新的问题?“长”和“短”是主观的。建议你展示你的“长”脚本,或者至少对其长度进行定量描述,然后也许有人可以告诉你是否可以用较短的脚本和/或更简单的脚本来完成。编辑问题。如果需要更多信息,请检查并告知我。请尝试“cat文件3文件2文件1 |排序-u-t~-k1,1”