Он не включен в ядро Linux.
lklm сообщение:Ганс Петер Анвин
We already have that, it's called initramfs; you can use either busybox or klibc ash in this space, and no need to run it in kernel space.
Running this kind of crap in kernel space is lunacy in the extreme.
$ awk '!(/^C\(..[0-9])$/ && seen[$0]++)' file
V(Mn9)
V(C1,H3)
V(Mn6)
V(Mn6)
V(C4,H6)
V(Mn9)
V(Mn9)
V(C1,Mn6)
V(C4,Mn9)
V(Mn6)
V(C1,C4)
C(Mn9)
C(Mn6)
C(C1)
C(C4)
V(C1,H2)
V(Mn9)
V(Mn6)
V(C4,H5)
Вышеприведенное предполагает, что у вас нет пробелов до/после видимых символов в вашем образце ввода. Если вы это сделаете, удалите их, например.:
$ awk '{gsub(/^[[:space:]]+|[[:space:]]+$/,"")} !(/^C\(..[0-9])$/ && seen[$0]++)' file
V(Mn9)
V(C1,H3)
V(Mn6)
V(Mn6)
V(C4,H6)
V(Mn9)
V(Mn9)
V(C1,Mn6)
V(C4,Mn9)
V(Mn6)
V(C1,C4)
C(Mn9)
C(Mn6)
C(C1)
C(C4)
V(C1,H2)
V(Mn9)
V(Mn6)
V(C4,H5)
Предлагаю использовать sed
для сбора строк в трюме, чтобы проверить, появились ли они раньше:
sed -n 'H;G;/^\(C([^)]*)\).*\1 *\n/!P'
H
добавляет текущую строку в область хранения G
добавляет пространство хранения со всеми строками, которые мы когда-либо видели, к пространству шаблонов C([^)]*)
является одним из тех шаблонов C(…)
,^
привязывает его к началу строки, и он окружен \(…\)
, поэтому позже на него можно будет ссылаться как \1
. Нам нужно \1 *\n
в качестве шаблона с новой строкой (после возможных пробелов ), чтобы избежать совпадения с только что добавленной строкой в конце. Таким образом, весь шаблон /^\(C([^)]*)\).*\1 *\n/
соответствует строке с дубликатом C(…)
, поэтому, только если этот !
не соответствует, P
печатать все до первой новой строки (= без добавленного пробела для хранения ), в то время как вывод по умолчанию подавляется опцией -n
Обратите внимание, что в зависимости от вашей sed
версии и размера файла может произойти сбой, поскольку со временем все строки будут находиться в памяти.