Я думаю, это проще всего.
ps -ef | ( head -n 1 ; sort )
или вот это, что возможно быстрее, так как не создается под-оболочка
ps -ef | { head -n 1 ; sort ; }
Другие классные применения
перестановка строк после строки заголовка
cat file.txt | ( head -n 1 ; shuf )
разворот строк после строки заголовка
cat file.txt | ( head -n 1 ; tac )
grep -vxf <(grep -of file_1 file_2 | sort -u) file_1
файл _1
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
GACGGAGGATGCAAGTGTTATCCGGAAT
3
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
файл _2
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCG
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCCGTAG
Выход
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
awk
+grep
раствор:
awk '/^[^>0-9]/{
m = ""; cmd = sprintf("grep -m1 %s file2", $0);
cmd | getline m; close(cmd);
if (m) next;
}1' file1
cmd
-критическая grep
команда m
-переменная, заполненная возможным совпадающим элементом Выход:
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
Использование скрипта awk
:
NR == FNR { seq[++n] = $1; next }
{
header = $0
getline
for (i = 1; i <= n; ++i) {
if (match(seq[i], $0) > 0) {
print header
next
}
}
print header
print
}
Запуск:
$ awk -f script.awk file2 file1
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
Скрипт сначала считывает 2000 последовательностей из file2
в массив seq
,а затем читает заголовок из file1
, за которым следует последовательность из file1
(, используя getline
). Затем он проходит через массив seq
, чтобы найти последовательность, содержащую текущую последовательность из file1
. Если такая последовательность найдена, печатается заголовок, и скрипт переходит к следующей строке в file1
. В противном случае печатаются и заголовок, и последовательность.
Сценарий предполагает, что file1
содержит чередующиеся строки заголовка и строки последовательности и абсолютно не содержит многострочной последовательности -.
Ниже приведен тот же сценарий, но с использованием СУХОГО принципа («Не повторяйся»):
NR == FNR { seq[++n] = $1; next }
{
header = $0
getline
found = 0
for (i = 1; i <= n; ++i) {
if (match(seq[i], $0) > 0) {
found = 1
break
}
}
print header
if (!found) print
}