Больше нет группы под названием "X Window System", так что это не будет работать.
Возможно, лучше всего будет:
rpm -qa|grep xorg > a
rpm -e --nodeps cat a
который удалит партию.
Теперь отредактируйте и избавьтесь от части с версией, и попытаться
yum install cat a
awk по умолчанию пробегает по файлу только один раз, выполняя все блоки в порядке, поэтому выдает результат, который вы получили. Вы можете получить желаемое поведение, используя массив для сохранения строк по ходу работы, при этом обрабатывая файл только один раз:
BEGIN {
AgeIndex = 1
HeightIndex = 1
}
/Age/ {
ages[AgeIndex] = $0
AgeIndex+=1
}
/Height/ {
heights[HeightIndex] = $0
HeightIndex+=1
}
END {
for (x = 1; x < AgeIndex; x++)
print ages[x] "\n"
for (x = 1; x < HeightIndex; x++)
print heights[x] "\n"
}
Сохраните это, скажем, в filter.awk
, а затем запустите:
awk -f filter.awk output.txt > output2.txt
, чтобы получить желаемый результат:
$ awk -f filter.awk < data
Age 1
Age 2
Height 1
Height 2
Мы делаем два массива возраста
и высоты
и сохраняем каждую подходящую строку в них по ходу работы. AgeIndex
держит, как далеко мы заходим через массив. В конце мы распечатываем каждую сохраненную строку (и дополнительную новую строку, как вы хотите), сначала все возраста, затем все высоты.
Массивы к концу сохранят весь файл в памяти, так что если ваш файл особенно велик, вам придется обменять использование памяти на время прохождения через весь файл более одного раза. На данный момент это практически то же самое, что и программа на любом другом языке - если у вас нет особых причин использовать awk, вы можете предпочесть другой язык. Честно говоря, думаю, я бы порекомендовал, чтобы - awk здесь не очень много покупает.
. С помощью gawk
:
$ awk -F"\t" '
{ a[$1]++ }
END {
n = asorti(a,b);
for (i = 1; i <= n; i++) {
print b[i];
if (i%2 == 0) {
printf "\n";
}
}
}
' output.txt
Age 1
Age 2
Height 1
Height 2
Weight 1
Weight 2
Я предполагаю, что пустые строки не являются частью вашего настоящего файла, или, по крайней мере, вам на них наплевать. Если это так, то все, что вам нужно, это sort
:
$ cat output.txt
Age 1
Height 1
Weight 1
Age 2
Height 2
Weight 2
$ sort output.txt
Age 1
Age 2
Height 1
Height 2
Weight 1
Weight 2
Однако, если ваши файлы не слишком большие, чтобы хранить их в памяти, возможно, будет проще сделать все это за один шаг:
grep -whE 'Age|Height|Weight' *txt | sort > outfile
Вышеуказанные файлы будут искать Возраст
или Высота
или Вес
во всех файлах, имя которых заканчивается на txt
в текущем каталоге (*txt
). Значение -w
означает "соответствовать только целым словам" (чтобы Age
не соответствовало, например, Ageing
), необходимо, чтобы -h
, так как без него имя файла выводилось вместе со строкой соответствия, когда дается более одного входного файла. В -E
включены расширенные регулярные выражения, которые дают нам |
для ИЛИ.
ПРИМЕЧАНИЕ: Если по каким-либо причинам вы действительно хотите, чтобы между каждой записью проходила дополнительная пустая строка (что не является тем, что может быть выведено вашей командой grep
), вы можете добавить ее с помощью:
grep -whE 'Age|Height|Weight' *txt | sort | sed 's/$/\n/'
$ for i in {1..3}; do echo -e "Name $i\nAge $i\nHeight $i\nWeight $i" > $i.txt; done
$ for f in *txt; do echo " -- $f --"; cat $f; done
-- 1.txt --
Name 1
Age 1
Height 1
Weight 1
-- 2.txt --
Name 2
Age 2
Height 2
Weight 2
-- 3.txt --
Name 3
Age 3
Height 3
Weight 3
$ grep -whE 'Age|Height|Weight' *txt | sort
Age 1
Age 2
Age 3
Height 1
Height 2
Height 3
Weight 1
Weight 2
Weight 3
В любом случае, даже если sort
не вырезает его для вас, я бы сделал это на Perl, а не awk
(это в предположении, что вы хотите дополнительные пустые строки, которые, опять же, вы, вероятно, не хотите):
$ perl -ane '$k{$F[0]}.=$_."\n" if /./;
END{print $k{$_},"\n" for sort keys (%k)}' output.txt
Age 1
Age 2
Height 1
Height 2
Weight 1
Weight 2
Вы можете пропустить это через head -n -2
, чтобы избавиться от последних двух пустых строк, если вы не хотите их.
питон
решение этой задачи:
from collections import defaultdict
f = open("output.txt", "r")
d = defaultdict(list)
for line in f:
line = line.strip()
if line != '':
arr = line.split(" ")
d[arr[0]].append(arr[1])
print d.items()
я хэшировал, используя первый столбец, и поместил его в список.
Вы можете использовать sort
:
grep -E 'Age|Height|Weight' [input file] | sort > output.txt