perl -F, -lane '
exists $h{$F[0]} or $h[$h{$F[0]}=@h]=$_;
$h=$_; /,false$/ or $_=$h for $h[$h{$F[0]}];
END{ print for @h; }
' duplicates.file
Структури даних:
- Хеш
%h
, ключі яких є першими полями (AAA, BBB, CCC тощо) та відповідні значення - це цифри, що вказують на порядок, у якому були зустрічаються ключі. Так, наприклад, ключ AAA => 0, ключ BBB => 1, ключ CCC => 2.
- Масив
@h
, елементи якого - це рядки, що містяться в порядку друку. Отже, якщо в даних знайдеться і істинне, і неправдиве значення, помилкове значення перейде в масив. OTW, якщо є один тип даних, то це буде присутнє.
Ще один спосіб використання sed GNU:
sed -Ee '
G
/^([^,]*),(false|true)\n(.*\n)?\1,\2(\n|$)/ba
/^([^,]*)(,true)\n(.*\n)?\1,false(\n|$)/ba
/^([^,]*)(,false)\n((.*\n)?)\1,true(\n|$)/{
s//\3\1\2\5/;h;ba
}
s/([^\n]*)\n(.*)$/\2\n\1/;s/^\n*//
h;:a;$!d;g
' duplicates.file
FWIW, еквівалентний код POSIX для вищевказаного коду GNU наведено нижче:
sed -e '
G
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false$/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false\n/ba
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true$/{
s//\3\1\2/
h
ba
}
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true\n/{
s//\3\1\2\n/
h
ba
}
y/\n_/_\n/
s/\([^_]*\)_\(.*\)$/\2_\1/;s/^_*//
y/\n_/_\n/
h;:a;$!d;g
' duplicates.file
Пояснення
- У цьому методі ми зберігаємо результат, який буде остаточно надрукований у просторі утримування.
- Для кожного прочитаного рядка ми додаємо простір утримування до простору шаблону для дослідження поточного рядка відносно існуючого стану простору утримування.
- Зараз під час цього порівняння може статися 5 речей:
- a) Поточний рядок збігається десь у рядку утримування & false: false.
- [ДІЯ] Оскільки такий самий хибний стан знайдено, то нічого не робіть.
- b) Поточна відповідність рядка десь у рядку утримування & true: true.
- [ДІЯ] Оскільки такий самий справжній стан знайдено, то нічого не робіть.
- c) Поточна відповідність рядка десь у рядку утримування & true: false.
- [ДІЯ] Оскільки помилковий стан вже існує, нічого не робіть.
- г) Поточна відповідність рядка десь у рядку утримування & false: true.
- [АКЦІЯ] Це передбачає певну роботу, в якій нам потрібно замінити помилкову лінію в точно такому ж місці, де знаходиться істина.
- д) Поточний рядок НЕ відповідає жодному місці у рядку утримування.
- [ДІЯ] Перемістіть поточний рядок до кінця.
Результати
AA,false
BB,false
CC,false
DD,true
true
якщо це перший екземпляр першого стовпця?