Вам не хватает места вокруг [и]. Это должно выглядеть так:
for team in `cat teams.txt`
do
if [ "$team" == "Bills" ]
then
echo "$team hired Rex Ryan as coach"
fi
echo "$team Nation"
done
Использование AWK:
awk -F, 'data[$1] && !output[$1] { print data[$1]; output[$1] = 1 }; output[$1]; { data[$1] = $0 }'
Он просматривает каждую строку и ведет себя следующим образом:
Если все ваши идентификаторы имеют одинаковую длину (8 символов в вашем примере ), вы можете сделать все это, используя sort
и GNUuniq
:
$ sort file | uniq -Dw 8
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019
Если они имеют разную длину, вы все равно можете использовать этот подход, но он становится немного сложнее:
$ tr ',' ' ' < file | sort | rev | uniq -f2 -D | rev | tr ' ' ','
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019
awk -F, '$1 in m { print m[$1]$0; m[$1]=""; next }
{ m[$1]=$0 "\n" }' ex
Это можно сделать с помощью GNU sed
, используя его расширенные конструкции регулярных выражений. Сначала мы загружаем файл в пространство шаблонов, а затем удаляем все неповторяющиеся строки (и )из начала пространства шаблонов. Кроме того, флаг \n\n
помещается в конце пространства шаблона, в котором мы перебрасываем повторяющиеся строки. Итак, как только этот флаг всплывает до начала пространства шаблонов =>, операция завершена, и теперь мы можем удалить маркеры из пространства шаблонов и вывести на стандартный вывод.
$ sed -Ee '
$!{
N;s/^/\n/
$s/$/\n\n/;D
}
/^([^,\n]*),[^\n]*\n(.*\n)?\1,/!D
s/^([^\n]*)(.*)/\2\1\n/;/^\n\n/!D
s/^\n\n//;s/\n$//
' inp
Это версия POSIX-sed
И еще один способ решения проблемы, когда мы не поддерживаем весь файл в любой момент времени ни в шаблоне, ни в пространстве хранения. Как только видна повторяющаяся строка, она печатается в стандартный вывод, И эталонная строка помечается и печатается, помечается, потому что мы не хотим печатать ее в следующий раз, когда ее дубликат будет виден.
$ sed -ne '
H;g;y/\n_/_\n/
/.*_\([^,_]*\)\(,[^_]*\)\[0]_\(.*_\)\{0,1\}\1,[^_]*$/{
s//\1\2/;y/_\n/\n_/;p
g;s/.*\n//p;g;y/\n_/_\n/
s/\(.*_\([^,_]*\),[^_]*\)\[0]\(_\(.*_\)\{0,1\}\)\2,[^_]*$/\1[1]\3/
s/_$//;y/_\n/\n_/;bh
}
/.*_\([^,_]*\)\(,[^_]*\)\[1]_\(.*_\)\{0,1\}\1,[^_]*$/{
s/.*_//;y/_\n/\n_/;p
g;s/\(.*\)\n.*/\1/;bh
}
y/_\n/\n_/;s/$/[0]/;:h;h
' inp
Это основанное на Perl
решение проблемы, когда мы храним строки в хэше массива. Как только мы видим повторяющуюся строку, мы печатаем массив и также очищаем его, а также печатаем повторяющуюся строку.
$ perl -F, -lane '
push(@{$h{$F[0]}},$_),next if ! exists $h{$F[0]};
print for splice(@{$h{$F[0]}}),$_;
' inp
Выход:
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019