объединить строки с одинаковыми column1 и column 2 - PullRequest
1 голос
/ 19 марта 2020

Я новичок в bash. У меня есть файл .csv. Он содержит 3 столбца (имя, число и значение). Вот содержимое столбцов:

Name,Num,Value 
ex1,10.20.30.40,val1
ex2,20.30.40.30,val2
ex3,10.45.60.20,val3
ex4,10.20.30.40,val1
ex5,20.30.40.30,val2

Если 2-ые столбцы 2-х строк идентичны, их третья строка также идентична. Я хочу объединить строки, чтобы их 2-й столбец (и, следовательно, 3-й столбец) был идентичен. Например здесь у меня есть 2 строки, что их 2-й столбец "10.20.30.40". Я хочу, чтобы вывод был таким:

Name,Num,Value 
ex1 ex4,10.20.30.40,val1
ex2 ex5,20.30.40.30,val2
ex3,10.45.60.20,val3

Используя этот код, я могу получить 1-й и 2-й, как я хотел:

awk 'BEGIN{FS=","} NR==1{print;next} {a[$2]=$2 in a ? a[$2] " " $1 : $1} END{for(i in a) print a[i] "," i}' file

Вот вывод:

Name,Num,Value
ex1 ex4,10.20.30.40
ex2 ex5,20.30.40.30
ex3,10.45.60.20

, но не отображается 3-й столбец. Я попробовал это:

awk 'BEGIN{FS=","} NR==1{print;next} {a[$2]=$2 in a ? a[$2] " " $1 : $1} END{for(i in a) print a[i] "," i "," a[i]}' file

, но это не сработало, он снова напечатал 1-й столбец как 3-й столбец. Например:

Name,Num,Value
ex1 ex4,10.20.30.40,ex1 ex4
ex2 ex5,20.30.40.30,ex2 ex5
ex3,10.45.60.20,ex3

Как мне манипулировать кодом, чтобы получить желаемый результат?

1 Ответ

1 голос
/ 19 марта 2020

Вы можете использовать это awk:

awk 'BEGIN { FS=OFS="," }
NR==1 {
   print
   next
}
{
   k=$2 FS $3
   a[k] = (k in a ? a[k] " ": "") $1
}
END {
   for (i in a) print a[i], i
}' file.csv

Name,Num,Value
ex3,10.45.60.20,val3
ex2 ex5,20.30.40.30,val2
ex1 ex4,10.20.30.40,val1

Если вы хотите вывод в том же порядке, как показано в вопросе, то вы можете использовать это решение gnu-awk:

awk 'BEGIN{FS=OFS=","}
NR==1{print; next}
{k=$2 FS $3; a[k] = (k in a ? a[k] " ": "") $1}
END{PROCINFO["sorted_in"] = "@val_str_asc"; for (i in a) print a[i], i}' file.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...