печатать каждую n-ю строку подряд с помощью gawk

У меня есть очень большой файл, в котором мне нужно получить каждую n-ю строку и вывести ее в строку.

Мои данные:

1      937  4.320194
2      667  4.913314
3      934  1.783326
4      940  -0.299312
5      939  2.309559
6      936  3.229496
7      611  -1.41808
8      608  -1.154019
9      606  2.159683
10     549  0.767828

Я хочу, чтобы мои данные выглядели так:

1      937  4.320194
3      934  1.783326
5      939  2.309559
7      611  -1.41808
9      606  2.159683

Это, конечно, пример, мне нужна каждая 10-я строка для моего огромного файла данных. Я пробовал это до сих пор:

 NF == 6 {
     if(NR%10) {print;}
     }

person user1269741    schedule 01.04.2012    source источник


Ответы (5)


Чтобы напечатать каждую вторую строку, начиная с первой:

awk 'NR%2==1' file.txt

Чтобы напечатать каждую десятую строку, начиная с десятой строки:

awk 'NR%10==0' file.txt

Чтобы использовать это в сценарии, добавьте следующее в файл с именем script.awk:

BEGIN {
    print "Processing file"
}

NR%10==0

END {
    print "Finished processing"
}

Затем выполните:

awk -f script.awk file.txt
person Steve    schedule 01.04.2012
comment
Разве это не должно быть awk 'NR%10==0' file.txt? - person D.Shawley; 02.04.2012
comment
@ D.Shawley Да, вы правы. Я действительно должен прочитать все, прежде чем отвечать! Ваше здоровье! - person Steve; 02.04.2012
comment
Большое спасибо, я знаю, что это был простой вопрос, но я не мог понять его для жизни. - person user1269741; 02.04.2012
comment
Если в любом случае выполнить это в скрипте? - person user1269741; 02.04.2012
comment
ХТН. Кроме того, вам не нужны блоки BEGIN или END. - person Steve; 02.04.2012

С sed вы можете довольно легко сделать множество вариаций с помощью команды first~step. Например:

# Odd lines
sed -n 1~2p file
# Every tenth line (10, 20, 30, ...)
sed -n 10~10p file
# Every tenth line (1, 11, 21, ...)
sed -n 1~10p file
# First plus every tenth (1, 10, 20, 30, ...)
sed -n -e 1p -e 10~10p file
person Kevin    schedule 01.04.2012
comment
@Gerard См.: stackoverflow.com/questions/30003570/ - person arielf - Reinstate Monica; 14.01.2016

Кусочек пирога: cat test.txt | awk 'NR % 10 == 1'

person Johan Kotlinski    schedule 01.04.2012
comment
Это печатает строку, следующую за каждой 10-й строкой - строки 1, 11, 21, 31 и т. д. Вам нужны строки, в которых модуль равен нулю, а не 1. - person D.Shawley; 02.04.2012
comment
Ну почему? Это также печатает каждую 10-ю строку, начиная с первой, и это соответствует тому, что дано в качестве примера. - person Johan Kotlinski; 02.04.2012

Это не (g)awk, но сработает:

cat myfile | grep ^[[:digit:]]*0[[:blank:]] должно помочь.

person Mahmoud Al-Qudsi    schedule 01.04.2012

Делаем это прямо в командной строке (Windows).

Поместите файл gawk.exe в папку, где находится файл, и запустите командную строку в папке и напишите

gawk "NR%n==x" oldfile.txt>newfile.txt

n — это каждая n-я строка, которую вы хотите напечатать, а x — начальная строка.

Например, n=10 и x=1, вывод строки 1,11,21,31,41...конечная строка из исходного файла в новый файл.

Например, n=20 и x=5, вывод строки 5,25,45,65......конечная строка из исходного файла в новый файл.

person Nicolaj Hansen    schedule 22.02.2019