【问题标题】:Compare first column in two files, if match: update last column variable, else: append line to second file比较两个文件中的第一列,如果匹配:更新最后一列变量,否则:将行附加到第二个文件
【发布时间】:2019-12-16 12:48:53
【问题描述】:

我想取 file1 的 col1,如果 file2 的 col1 匹配,则更新最后一列中的“更新日期”。如果没有匹配项,我想将 file1 的整行附加到 file2 并将“更新日期”值也附加到该行。

我目前正在使用awk 'NR==FNR{c[$1]++;next};c[$1] > 0' file2 file1 进行基线比较,但是如果匹配,则会错误地打印整行,而且我也无法弄清楚如何添加另一个条件来更新日期列。我也在尝试在 shell 脚本中执行此操作。

文件 1

userName | cpu% | command | date created

   user1, 101.6, plasma-de+, Thu Aug  8 09:30:17 MDT 2019
   user2, 100.0, plasma-de+, Thu Aug  8 09:30:17 MDT 2019
   user3, 102.0, plasma-de+, Thu Aug  8 09:30:17 MDT 2019

文件 2

userName | cpu% | command | date created | date updated

    user1, 101.6, plasma-de+, Mon Aug  5 06:35:39 MDT 2019,    Mon Aug  5 06:35:39 MDT 2019 
    user2, 100.0, plasma-de+, Mon Aug  5 06:35:39 MDT 2019,    Mon Aug  5 06:35:39 MDT 2019

命令运行后的文件 2

userName | cpu% | command | date created | date updated

    user1, 101.6, plasma-de+, Mon Aug  5 06:35:39 MDT 2019,    Thu Aug  8 09:30:17 MDT 2019
    user2, 100.0, plasma-de+, Mon Aug  5 06:35:39 MDT 2019,    Thu Aug  8 09:30:17 MDT 2019
    user3, 102.0, plasma-de+, Thu Aug  8 09:30:17 MDT 2019,    Thu Aug  8 09:30:17 MDT 2019

【问题讨论】:

  • 您的列是如何分隔的?有标签吗?
  • @Shawn 只是空格。该信息最初来自调用“top”
  • 那一定会让处理时间戳字符串变得有趣。当您不添加一列而是添加 6 列时,它肯定会使答案复杂化。
  • @Shawn 我该如何解决?顶部吐出前 3 列,然后我手动附加创建日期的值。
  • @Shawn 啊,这很容易。更新了我的帖子,列现在用逗号作为分隔符。

标签: awk text-processing


【解决方案1】:

一种假定您的文件已排序的非 awk 方式:

$ (join -t, -j1 -o 0,2.2,2.3,2.4,1.4 file1 file2; \
   join -t, -j1 -v1 -o 0,1.2,1.3,1.4,1.4 file1 file2)
user1, 101.6, plasma-de+, Mon Aug  5 06:35:39 MDT 2019, Thu Aug  8 09:30:17 MDT 2019
user2, 100.0, plasma-de+, Mon Aug  5 06:35:39 MDT 2019, Thu Aug  8 09:30:17 MDT 2019
user3, 102.0, plasma-de+, Thu Aug  8 09:30:17 MDT 2019, Thu Aug  8 09:30:17 MDT 2019

或者在没有这个限制的情况下使用 awk:

$awk 'BEGIN { FS = OFS = "," }
      NR == FNR { a[$1] = $0; b[$1] = $4; next }
      $1 in a { $5 = b[$1]; delete a[$1]; print }
      END { for (u in a) print a[u], b[u] }' file1 file2
user1, 101.6, plasma-de+, Mon Aug  5 06:35:39 MDT 2019, Thu Aug  8 09:30:17 MDT 2019
user2, 100.0, plasma-de+, Mon Aug  5 06:35:39 MDT 2019, Thu Aug  8 09:30:17 MDT 2019
user3, 102.0, plasma-de+, Thu Aug  8 09:30:17 MDT 2019, Thu Aug  8 09:30:17 MDT 2019

【讨论】:

  • 使用该命令并没有给我我需要的结果。它只返回文件 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多