$ 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
получает нормальную локаль, чтобы строки сортировались правильно, чтобы это работало.
Немного изменив исходный сценарий,
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.txt
case -.
Вывод сохраняется во временном файле c.txt
, который затем перезаписывает файл b.txt
, если awk
завершился успешно.
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