awk 'FNR == 1 { FILENUM++ } SEEN[$0] == FILENUM - 1 { SEEN[$0] = FILENUM } END { for (s in SEEN) if (FILENUM == SEEN[s]) print s }' *.txt
Объяснение
При чтении первой строки каждого файла, инкремента
FILENUM
, так, чтобы при чтении n th файл,FILENUM
n.При чтении каждой строки считайте количество файлов, в которых та строка была замечена (но только необходимо потрудиться делать это, если строка была замечена в каждом предыдущем файле).
Когда там больше не вводится, чтобы считать, распечатать все строки, которые были замечены во всех файлах.
Внимание: Как с несколькими из решений, отправленных здесь, у этого также есть слабость. Согласно вопросу, если какой-либо из входных файлов пуст, там, как предполагается, не вывод вообще. Однако, так как awk является ориентированным на строку инструментом, он игнорирует пустые файлы. Таким образом,
FNR == 1 { FILENUM++ }
сбои для постепенного увеличенияFILENUM
для пустых файлов.С GNU awk, возможно исправить эту ошибку с помощью
ARGIND
встроенная переменная.gawk 'SEEN[$0] == ARGIND - 1 { SEEN[$0] = ARGIND } END { for (s in SEEN) if (ARGIND == SEEN[s]) print s }' *.txt
e
используется для перехода в конец слова. Вы должны использовать $
, чтобы перейти в конец строки.
Вы можете вставить другую строку из текущей позиции, используя или
(для открытия).
Вы также можете использовать A
, чтобы добавить что-нибудь в конец строки из любого места в строке.
o
( o ручка).
Он немедленно создаст новую пустую строку
, поэтому вам не нужно вводить Введите
(до / пока вы хотите добавить две или более строк). i
( i nsert)?
Чтобы добавить текст после текущей позиции, используйте a
( a ppend).
Или, чтобы добавить текст в конец текущей строки, используйте A
,
, что фактически является сокращением от $ a
.