Gawk ссылается на поля и вставляет значение

$ LC_ALL=C sort -r <file | LC_ALL=C sort -k1,1 -us
hxxp://a.com "good"
hxxp://about.com
hxxp://b.com "good"
hxxp://c.com "good"
hxxp://google.com "Seen"
hxxp://reddit.com
hxxp://x.com
hxxp://y.com
hxxp://yahoo.com "Check again"
hxxp://z.com

Первый sortсортирует файл в обратном порядке, используя всю строку в качестве ключа сортировки. Это приведет к промежуточному результату

hxxp://z.com
hxxp://yahoo.com "Check again"
hxxp://yahoo.com
hxxp://y.com
hxxp://x.com
hxxp://reddit.com
hxxp://google.com "Seen"
hxxp://google.com
hxxp://c.com "good"
hxxp://c.com
hxxp://c.com
hxxp://b.com "good"
hxxp://about.com
hxxp://a.com "good"
hxxp://a.com

приведены данные примера. Обратите внимание, что строки, содержащие дополнительную аннотацию, всегда идут перед соответствующими строками без дополнительной аннотации.

Второй sortсоздает только те строки, ключ сортировки которых уникален. Мы используем только первое поле (URL )в качестве ключа сортировки. Мы также просим sortиспользовать «стабильный» алгоритм сортировки с -s. Это означает, что порядок строк с одинаковыми ключами не изменится от того, что на входе.

Комбинация -uи -sдает вам только строки с дополнительными аннотациями для повторяющихся URL-адресов.

Бит LC_ALL=Cдолжен убедиться, что sortполучает нормальную локаль, чтобы строки сортировались правильно, чтобы это работало.

2
24.08.2020, 20:51
2 ответа

Немного изменив исходный сценарий,

awk '
    BEGIN{FS=OFS="\t"}
    #Parsing first file
    FNR==NR{a[tolower($1)]=$2;next}
    #Parsing second file
    {
        i=tolower($2)
        if(i in a){$4=a[i];print}
    }
' a.txt b.txt > c.txt &&
mv c.txt b.txt

tolowerиспользуется для нечувствительного сопоставления 1-го поля a.txtсо 2-м полем b.txtcase -.

Вывод сохраняется во временном файле c.txt, который затем перезаписывает файл b.txt, если awkзавершился успешно.

2
18.03.2021, 23:10
awk '
    BEGIN { FS=OFS="\t" }
    { split(tolower($0),lc) }
    NR==FNR {
        a[lc[1]] = $2
        next
    }
    lc[2] in a {
        $4 = a[lc[2]]
        print
    }
' a.txt b.txt
1
18.03.2021, 23:10

Теги

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