Как я могу удалить каждую X-ю строку в текстовом файле? - PullRequest
24 голосов
/ 27 марта 2012

Рассмотрим текстовый файл с научными данными, например:

5.787037037037037063e-02 2.048402977658663748e-01
1.157407407407407413e-01 4.021264347118673754e-01
1.736111111111111049e-01 5.782032163406526371e-01

Как я могу легко удалить, например, каждую вторую строку или каждые 9 из 10 строк в файле?Например, возможно ли это с помощью bash-скрипта?

Справочная информация: файл очень большой, но мне нужно гораздо меньше данных для построения графика.Обратите внимание, что я использую Ubuntu / Linux.

Ответы [ 6 ]

57 голосов
/ 27 марта 2012

Это легко сделать с помощью awk.

Удалить все остальные строки:

awk 'NR % 2 == 0' file > newfile

Удалить каждую 10-ю строку:

awk 'NR % 10 != 0' file > newfile

Переменная NR в awk - это номер строки. Все, что находится за пределами {} в awk, является условным, и действие по умолчанию - печать.

6 голосов
/ 27 марта 2012

Как насчет Perl?

perl -n -e '$.%10==0&&print'       # print every 10th line
3 голосов
/ 27 марта 2012

Вы можете сделать это с помощью sed, например,

sed -n -e 'p;N;d;' file # print every other line, starting with line 1

Если у вас есть GNU sed, это довольно просто

sed -n -e '0~10p' file # print every 10th line
sed -n -e '1~2p' file # print every other line starting with line 1
sed -n -e '0~2p' file # print every other line starting with line 2
2 голосов
/ 28 марта 2012

Это может сработать для вас (GNU sed):

seq 10 | sed '0~2d' # delete every 2nd line
1
3
5
7
9
seq 100 | sed '0~10!d' # delete 9 out of 10 lines
10
20
30
40
50
60
70
80
90
100
2 голосов
/ 27 марта 2012

Попробуйте что-то вроде:

awk 'NR%3==0{print $0}' file

Это напечатает одну строку из трех. Или:

awk 'NR%10<9{print $0}' file 

напечатает 9 строк из десяти.

0 голосов
/ 27 марта 2012

Вы можете использовать awk и скрипт оболочки.Awk может быть трудным, но ...

Это приведет к удалению определенных строк, которым вы говорите:

nawk -f awkfile.awk [filename]

awkfile.awk contents

BEGIN {
if (!lines) lines="3 4 7 8"
n=split(lines, lA, FS)
for(i=1;i<=n;i++)
 linesA[lA[i]]
}
!(FNR in linesA)

Также я не могу вспомнить, поставляется ли VIM со стандартной Ubuntu или нет.Если не получится.

Затем откройте файл с помощью vim vim [имя_файла]

Затем введите

:%!awk NR\%2 or :%!awk NR\%2 

Это удалит все остальные строки.Просто измените 2 на другое целое число для другой частоты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...