Использование исходных табличных данных в файле с именемfile
:
sed '1d' file | sort -u |
awk '{ color[$1] = ( color[$1] == "" ? $3 : color[$1] "," $3 ) }
END { for (user in color) print user, color[user] }'
Это генерирует
CCC red
BBB blue,red
AAA black,blue,green,red
Три этапа конвейера:
sed
удаляет первую строку, которая является заголовком, который мы не хотим читать. Команда sort
дает нам уникальные строки. Пример данных после sort
выглядит как
AAA | black
AAA | blue
AAA | green
AAA | red
BBB | blue
BBB | red
CCC | red
awk
берет эти данные и создает строку с разделителями-запятыми -для каждого пользователя в массиве color
(, где имя пользователя является ключом в массиве ).В конце (в блоке )END
выводятся все собранные данные. Как упоминалось в комментариях, должна быть возможность реализовать всю цепочку вызовов AWK и sed как единую программу AWK.
Чтобы ответить на заданный вами вопрос, чтобы проверить, является ли последний символ третьего поля «1», вы можете использовать
$3 ~ /1$/
вместо substr
, поэтому в вашем случае
$3 ~ /1$/ {print $3$2,$1}
Я придумал
$3 == "CDS" && $1 ~ /1$/ {
split($9,A,";") ;
B=substr(A[4],6) ;
V[B $7] = $1 ;
}
END {
for (u in V) {
print u >> V[u] ;
close(V[u]) ;
}
}
в результате 17042 файла.
$3 == "CDS" && $1 ~ /1$/
для awk '$3=="CDS"'
иawk 'substr($3,11,11)==1
split($9,A,";") ;
для sed 's/;/\t/g'
иawk '{print $1,$7,$12}'
B=substr(A[4],6) ;
дляsed 's/Name=//g'
V[B $7] = $1 ;
для sort
иuniq
Чтобы выполнить скрипт, вставьте код в filter.awk
, затем
awk -f filter.awk file_to_parse