【问题标题】:Sort & Uniq the values on specific column对特定列上的值进行排序和唯一化
【发布时间】:2020-06-18 16:48:21
【问题描述】:

我的数据用 : 分隔

AA:w_c;w_c;r_c:1;3
BB:sync;sync:4
CC:t_wak;t_wak:6;7;8

我只需要在第 2 列中将一个值打印为唯一值。如果有多个唯一值,则需要在另一个文件中打印。

我试过了:

#!/bin/bash
sort -u -t : -k2,2 file >> txt
awk -F: '{gsub(";"," ",$3)}1' txt
Output:
BB:sync;sync:4
CC t_wak;t_wak 6 7 8
AA w_c;w_c;r_c 1 3

实际上,我正在尝试对第 2 列中的值进行排序和唯一化,并将该输出复制到另一个名为“txt”的文件中。然后我使用 AWk 替换 ;第 3 列中的空格似乎上面的代码不起作用。

所需的输出 1:

BB:sync:4
CC:t_wak:6 7 8

以上两个值是我们需要打印的实际输出,因为在第 2 列中它只包含一个值。

下面的需要在另一个文件中打印,因为在第 2 列中它包含多个值。

所需的输出 2:

AA:w_c;r_c:1;3  
w_c
r_c

在第 2 列中,它应该只有一个值,如果有多个,则需要在另一个文件中打印,如上所示。

【问题讨论】:

  • 首先感谢您在问题中添加表单代码。您能否在您的问题中提供更清晰的输入和预期输出,然后让我们知道。
  • @RavinderSingh13 我的输入是冒号分隔的文件,在第 2 列中它只需要一个值而不是 2 或更多..所以这就是我使用 sort 和 uniq 删除重复项并只打印一个的原因。基本上,在我的第 2 列输入中,只有重复值。在极少数情况下,我们会看到两个或更多的非重复值。
  • @RavinderSingh13 因此,如果值不重复,那么如果我正在打印唯一值,则不应在同一个文件中打印。它应该进入另一个文件。
  • @RavinderSingh13 如果您在实际/期望输出中遇到任何混淆,请告诉我。
  • @Kent 95% 的情况下它们会被重复,但极少情况下它们是由 ; 分隔的非重复值第 2 列中的分隔值 .. 像 clo1:a;a:col3:cl4 col1:a;b:clo3:col4

标签: bash awk


【解决方案1】:

这个快速解决方案应该适用于示例:

awk 'BEGIN{FS=OFS=":"} 
{ 
    split($2, a, ";")
    v=""; delete u
    for(i=1;i<=length(a);i++){
    if( ++u[a[i]]<2)
        v=v (i==1?"":";") a[i]
    }
    $2=v
    if(length(u)>1){
        print > "output2.txt"
        next
    }
}7' input

让我们做一个测试:

kent$  awk 'BEGIN{FS=OFS=":"} 
{ 
        split($2, a, ";")
    v=""; delete u
        for(i=1;i<=length(a);i++){
        if( ++u[a[i]]<2)
            v=v (i==1?"":";") a[i]
        }
    $2=v
    if(length(u)>1){
        print > "output2.txt"
        next
    }
}7' f
BB:sync:4
CC:t_wak:6;7;8

kent$  cat output2.txt 
AA:w_c;r_c:1;3

如果你想在 output2.txt 中包含 col2 中的每个值:

awk 'BEGIN{FS=OFS=":";out2="output2.txt"} 
{ 
    split($2, a, ";")
    v=""; delete u
    for(i=1;i<=length(a);i++){
        if( ++u[a[i]]<2)
            v=v (i==1?"":";") a[i]
        }
    $2=v
    if(length(u)>1){
        print > out2
        for(x in u)
            print x > out2
        next
    }
}7' input

然后你会得到:

kent$  cat output2.txt
AA:w_c;r_c:1;3
w_c
r_c

【讨论】:

  • 肯特,请问这里7的用法“}7'输入”
  • 7 非零数字在 awk 中执行默认操作。默认操作是:打印当前记录(行)。 @Akhil。你有什么问题需要理解?您可以在代码中添加print xxxx输出结果,它可以帮助您更好地理解它。
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多