Печать новой строки с помощью awk

Больше нет группы под названием "X Window System", так что это не будет работать. Возможно, лучше всего будет: rpm -qa|grep xorg > a rpm -e --nodeps cat a который удалит партию. Теперь отредактируйте и избавьтесь от части с версией, и попытаться yum install cat a

1
24.06.2014, 13:23
5 ответов

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 здесь не очень много покупает.

.
1
27.01.2020, 23:38

С помощью 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
1
27.01.2020, 23:38

Я предполагаю, что пустые строки не являются частью вашего настоящего файла, или, по крайней мере, вам на них наплевать. Если это так, то все, что вам нужно, это 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, чтобы избавиться от последних двух пустых строк, если вы не хотите их.

0
27.01.2020, 23:38

питон решение этой задачи:

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()

я хэшировал, используя первый столбец, и поместил его в список.

0
27.01.2020, 23:38

Вы можете использовать sort:

grep -E 'Age|Height|Weight' [input file] | sort > output.txt
0
27.01.2020, 23:38

Теги

Похожие вопросы