Замена substr в awk

Использование исходных табличных данных в файле с именем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

Три этапа конвейера:

  1. Команда sedудаляет первую строку, которая является заголовком, который мы не хотим читать.
  2. Команда sortдает нам уникальные строки. Пример данных после sortвыглядит как

    AAA         | black
    AAA         | blue
    AAA         | green
    AAA         | red
    BBB         | blue
    BBB         | red
    CCC         | red
    
  3. Команда awkберет эти данные и создает строку с разделителями-запятыми -для каждого пользователя в массиве color(, где имя пользователя является ключом в массиве ).В конце (в блоке )ENDвыводятся все собранные данные.
1
09.07.2020, 07:21
2 ответа

Как упоминалось в комментариях, должна быть возможность реализовать всю цепочку вызовов AWK и sed как единую программу AWK.

Чтобы ответить на заданный вами вопрос, чтобы проверить, является ли последний символ третьего поля «1», вы можете использовать

$3 ~ /1$/

вместо substr, поэтому в вашем случае

$3 ~ /1$/ {print $3$2,$1}
0
18.03.2021, 23:21

Я придумал

$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
0
18.03.2021, 23:21

Теги

Похожие вопросы