【问题标题】:Awk - Count Each Unique Value and Match Values Between 2 Filesawk - 计算每个唯一值并匹配 2 个文件之间的值
【发布时间】:2020-12-31 21:02:48
【问题描述】:

我有两个文件。我正在尝试获取文件 1 中第 8 列中每个唯一字段的计数,然后匹配第二个文件第 6 列中的唯一字段值。

所以本质上,我试图 -> 从 File1 的第 8 列中获取每个唯一值和值计数,如果在 file2 的第 6 列中有匹配项

文件1:

2020-12-23 23:59:12,235911688,\N,34,20201223233739,797495497,404,819,\N,
2020-12-23 23:59:12,235911419,\N,34,265105814,718185263,200,819,\N,
2020-12-23 23:59:12,235912029,\N,34,20201223233739,748362773,404,819,\N,
2020-12-23 23:59:12,235911839,\N,34,20201223233738,745662697,404,400,\N,
2020-12-23 23:59:12,235911839,\N,34,20201223233738,745662697,404,400,\N,
2020-12-24 23:59:12,235911839,\N,34,20201223233738,745662697,404,400,\N,

文件2:

public static String status_code                             =   "819";
public static String DeActivate                                  = "400";

预期输出:

total count of status_code,819 : 3
total count of DeActivate,400 : 3

我的代码:

awk 'NR==FNR{a[$8]++}NR!=FNR{gsub(/"/,"",$6);b[$6]=$0}END{for( i in b){printf "Total count of %s,%d : %d\n",gensub(/^([^ ]+).*/,"\\1","1",b[i]),i,a[i]}}' File1 File2

算法

1.从第一个文件中取出第 8 个字段:(例如:819)

2.计算文件中唯一 feild(819) 出现的时间(基于日期)

3从file2的第4个字段中取819对应的值

4个一起打印输出

我相信我应该能够用 awk 做到这一点,但由于某种原因,我真的很挣扎。

【问题讨论】:

  • 抱歉,这还不清楚,请使用代码标签编辑您的问题,使用更清晰的样本,然后让我们知道。例如--> \N 真的是您文件中的文字字符吗?
  • 是的,只需从第一个文件中获取唯一的第 8 个唯一字段计数,并从第二个文件中获取第 8 个字段的描述,然后将唯一字段、字段描述和字段计数一起打印 @RavinderSigh13
  • 为输出苦苦挣扎2天
  • 我明白了,我们都是来学习的。但是,如果您不提供确切的样本(这些样本会因您的问题而改变),那么没有人将能够提供帮助,因此最好保持您的样本清晰。就像我举的一个例子一样,\N 字符是否真的存在于您的样本中?请更好地编辑您的示例并使用 CODE TAGS 覆盖它们(就像 pii_ke 现在所做的编辑一样),一旦帖子更清晰,请告诉我们。
  • 第 8 列中每个唯一字段的计数基于第 1 列的日期这对输出有何影响?目前,我认为它在预期输出中根本没有影响它。这会导致关于同一主题的另一个问题吗?

标签: shell awk


【解决方案1】:

(类似于 SQL JOINing 两个关系数据库表,File1 的 $8 等于 File2 的 $6。)

awk '
NR==FNR {    # For the first file
    a[$8]++; # count each $8
}
NF&&NR!=FNR {             # For non empty lines of file 2
    gsub(/[^0-9]/,"",$6); # remove non-digits from $6
    b[$6]=$4              # save name of constant to b
}
END{
    for(i in b){   # for constants occurring in File2
        if(a[i]) { # if File1 had non zero count
            printf( "Total count of %s,%d : %d\n",b[i],i,a[i]);
                   #print data
        }
    }
}' "FS=," File1 FS=" " File2

以上代码适用于您的示例输入。它产生以下输出:

Total count of DeActivate,400 : 3
Total count of status_code,819 : 3

我认为主要问题是您没有将逗号指定为File1 的字段分隔符。见Processing two files with different field separators in awk

【讨论】:

  • 代码工作正常。但它打印来自file2的所有值描述。只需要来自file1的匹配值的描述..可以从reuslt中排除计数为0的项目。提前感谢
  • @Nithinjustin 我已经编辑过了。我认为它现在不打印输出为零计数。
  • 非常感谢!它的作品。如果你不介意你能解释一下代码吗..它会对每个人都有帮助
  • 稍后我会添加一些cmets。
  • "FS=," 的设置方式有点不寻常,它似乎有效。
【解决方案2】:

一种更短、更高效的方式,无需第二个数组和 for 循环:

$ cat demo.awk
NR == FNR {
    a[$8]++
    next
}

{
    gsub(/[^0-9]/,"",$6)
    printf "Total count of %s,%d : %d\n", $4, $6, a[$6]
}

$ awk -f demo.awk FS="," file1 FS=" " file2
Total count of status_code,819 : 3
Total count of DeActivate,400 : 3
$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2020-10-06
    • 2023-02-22
    • 2016-06-12
    • 2011-06-10
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多