【问题标题】:Merging files data on unix. Proper merge with update and insert in existing file在 unix 上合并文件数据。与更新正确合并并插入现有文件
【发布时间】:2016-10-03 02:31:48
【问题描述】:

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

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 是最新的文件。因此,对于具有第一个字段的记录,a 将使用 File3 中存在的值进行更新。以 c 开头的记录在 File2 和 File3 中没有更新,因此将保持不变。 File3 中的记录 e 是新的,因此添加到 File1。所以 File1 的最终内容

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"

标签: linux shell unix awk sed


【解决方案1】:

这个 awk 可以工作:

awk -F'~' '{line[$1]=$0} END {for (key in line) print line[key]}' File{1,2,3}

每条具有特定键的新记录都将替换之前的记录。

输出可能未排序。通过管道进入sort,或者如果您使用 GNU awk,则将其添加到循环之前的 END 块中:

PROCINFO["sorted_in"] = "@ind_str_asc"

ref1, ref2

【讨论】:

    【解决方案2】:
    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 ,然后根据第一列唯一并对其进行排序。列分隔符定义为“~”。

    【讨论】:

      猜你喜欢
      • 2016-11-17
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多