Добавление строки ко всем элементам ячеек в столбце с помощью awk или bash - PullRequest
3 голосов
/ 01 февраля 2020

У меня есть следующий текстовый файл:

$ cat file.txt
# file;GYPA;Boston
Josh      81-62    20
Mike      72-27    1;42;53
Allie     71-27    24;12

Я бы хотел добавить GYPA к каждому элементу третьего столбца следующим образом:

GYPA:20
GYPA:1;GYPA:42;GYPA:53
GYPA:24;GYPA:12

пока, я иметь

cat comb.awk

NR==1 {
    FS=";"; Add=$2
}

{
    FS="\t"; split($3,a,";");
    for (i in a) {
        print Add":"a[i] 
    }

}

часть массива не работает.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2020

Вы можете сделать это так:

#!/usr/bin/awk -f
NR == 1 {
    # Get the replacement string from the first line
    split($0, h, ";");
    add = h[2]
    next
}
{
    # split the last field by ';' into the array 'a'
    # n contains the number of elements in 'a'
    n=split($3,a,";");
    for(i=1;i<=n;i++){
        # print every element of a, separate by ','
        printf "%s%s:%s", (i-1)?",":"", add, a[i];
    }
    # finish the line by printing the ORS
    print ""
}
3 голосов
/ 01 февраля 2020

Предполагается, что в строке префикса, которую вы хотите добавить, нет обратных ссылок (например, &) или escape-символов:

$ awk -F';' 'NR==1{add=$2":"; FS=" "; next} {gsub(/(^|;)/,"&"add,$3); print $3}' file
GYPA:20
GYPA:1;GYPA:42;GYPA:53
GYPA:24;GYPA:12
2 голосов
/ 01 февраля 2020

Моя ошибка

Уточнение (возможно, для кого-то очевидное), что GYPA не должен быть жестко закодирован в сценарии, а должен быть получен из первой строки, начинающейся с # пришел в комментарии; Я не видел его, поэтому мой ответ в следующем неверен.

Фактический (неправильный) ответ

Почему бы не sed?

< file.txt sed -n '/^#/!{s/^[^ ]* *[^ ]* */GYPA:/;s/;/;GYPA:/g;p}'

Ну, написано так, что это немного нечитаемо, так что, может быть, переписать, как это лучше:

< file.txt sed -n '  # -n inhibits the automatic printing
/^#/!{                   # only for lines starting with #
s/^[^ ]* *[^ ]* */GYPA:/ # change the first two columns, space included to GYPA:
s/;/;GYPA:/g             # add a GYPA: after each semicolon
p                        # print the resulting line
}'

На самом деле я, возможно, слишком сильно зависим от опции -n, и я должен вылечить себя , так как неиспользование этого (или любого другого параметра) позволяет поместить все в скрипт, который автоматически интерпретируется оболочкой как sed скрипт:

#!/usr/bin/sed -f
/^#/d
s/^[^ ]* *[^ ]* */GYPA:/
s/;/;GYPA:/g

, который вы можете использовать так:

< file.txt ./thefileabove
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...