Сортировка и унификация значений в указанном столбце c - PullRequest
1 голос
/ 18 июня 2020

У меня есть данные, разделенные: с разделителями

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

На самом деле я пытаюсь выполнить сортировку и uniq значений в столбце 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 должно быть только одно значение, если их несколько, то необходимо распечатать в другом файле, указав их, как показано выше.

1 Ответ

0 голосов
/ 18 июня 2020

Это быстрое решение должно работать для примера:

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

Если вы хотите, чтобы каждое значение в col2 в output2.txt:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...