【问题标题】:awk triple files inputawk 三重文件输入
【发布时间】:2015-10-16 13:54:58
【问题描述】:

我有3个文件,如下:

文件1:

5372,5372,0,0,,1,0,1,1,0,1,0,0,0,0,0,0,1107,1107,,1.620000,1,2015-08-12,,,,,,,,,,,,,,,,,,,,,,,,
2110,2110,0,0,,0,0,1,0,0,0,0,1,1,1,1,1,1601,1601,,9.500000,1,2015-05-29,,,,,,,,,,,,,,,,,,,,,,,,
6900,6900,0,0,,1,0,1,1,0,0,0,0,0,0,0,0,1107,1107,,1.369000,1,2025-09-23,,,,,,,,,,,,,,,,,,,,,,,,
8755,8755,0,0,,1,0,1,1,0,0,0,0,0,0,0,0,1107,1107,,3.232000,1,2025-05-22,,,,,,,,,,,,,,,,,,,,,,,,

文件2:

5372,4074,,,,,2,,,
2110,4100,,,,,0,,,
6900,5246,,,,,0,,,
8755,5270,,,,,0,,,

文件3:

2187,2500
2188,1500
4227,2000
5270,3000

注意 File1File2File3NF 分别是 47102

需要检查File1中的$23是否等于2025,如果是,则将$21转换为$21*1000,然后将 $1 保存在数组中。 之后,从 File2 中获取 $2 以获取我们从 File1 中获取的 $1

现在我们应该比较 File1 中的 $21File3 中的 $2 如果值大于或等于,则从 File1打印 $1 >.

上述文件的预期输出:

8755

我已经尝试了以下代码:

awk -F"," '{
    if (NF==47) {
        if ($23 ~ /2025/) {$21=$21*1000}
        {A[$1]=$0}
    } else {
        if (NF==10) {
            if (A[$1]==$0) {B[$1]=$0}
        }
        {if (NF==2) {
            B[$1]==$0 && $21>=$2
        }
        {print $0}
    }
}'

但输出总是 File3

请指教。

【问题讨论】:

  • B[$1]==$0 && $23>=$2 应该做什么?这是一个比较表达式,但它不在if( ...)内。
  • @Barmar .. 抱歉打错了,是$21>=$2,是比较File1中转换后的$21的值和File3,如果 $21>=$2,我需要从 File1 中获取 $1 用于该记录。
  • 但它不在if 内,因此它对比较没有任何作用。
  • 不应该是if(B[$1]==$0 && $21>=$2) { do something }之类的吗?
  • @Barmar 这是最后一个 if 语句的操作,不是吗?

标签: linux unix awk


【解决方案1】:

试试这个:

awk -F',' '
    NF == 47 { A[$1] = $23 ~ /2025/ ? $21*1000 : $21 }
    NF == 10 { B[$2] = $1 }
    NF == 2 && A[B[$1]] >= $2 { print B[$1] }'

【讨论】:

  • 这个程序只打印 $1 的 File3。
  • 已修复。我刚刚用您的文件对其进行了测试,它正确打印了8755
  • 不幸的是,它不起作用,我将尝试几个解决方案,并更新问题。无论如何,谢谢你的帮助。
【解决方案2】:

您遇到的问题来自您将,- 都计为字段分隔符的事实。此外,47 作为 file1 中的多个字段非常令人困惑,因为在实际示例中只有 25 个字段(即使将 - 算作字段分隔符)。无论如何,从你应该写的问题中取出你的文件

awk -F'[,-]' 'NF==25{ if($23==2025) $21=$21*1000; A[$1]=$21 } 
              NF==10{ B[$2]=$1 }
              NF==2{ if(A[B[$1]]>=$2) print B[$1]}' file1 file2 file3

结果:

8755

根据您的实际情况将NF==25更改为NF==47

【讨论】:

  • 感谢您的回答,我将 File1 设置为 25 字段只是为了更方便,但是,我再次编辑使其成为 47。
  • 正如我所写 - 将 NF==25 更改为您喜欢的任何值,在任何情况下都应该有效,只需正确计算字段(如果 47 不包括 - 作为字段分隔符,则使用 @987654333 @)。
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2013-09-13
  • 2011-01-28
相关资源
最近更新 更多