Как я могу удалить каждую X-ю строку в текстовом файле?
Рассмотрим текстовый файл с научными данными, например:
5.787037037037037063e-02 2.048402977658663748e-01
1.157407407407407413e-01 4.021264347118673754e-01
1.736111111111111049e-01 5.782032163406526371e-01
Как я могу легко удалить, например, каждую вторую строку или каждые 9 из 10 строк в файле? Возможно ли это, например, с помощью bash script?
Фон: файл очень большой, но мне нужно гораздо меньше данных для построения. Обратите внимание, что я использую Ubuntu/Linux.
Ответы
Ответ 1
Это легко сделать с помощью awk.
Удалите каждую другую строку:
awk 'NR % 2 == 0' file > newfile
Удалите каждую 10-ю строку:
awk 'NR % 10 != 0' file > newfile
Переменная NR в awk - номер строки. Все, что находится вне {} в awk, является условным, а действие по умолчанию - печать.
Ответ 2
Как насчет perl?
perl -n -e '$.%10==0&&print' # print every 10th line
Ответ 3
Попробуйте что-то вроде:
awk 'NR%3==0{print $0}' file
Это напечатает одну строку из трех. Или:
awk 'NR%10<9{print $0}' file
напечатает 9 строк из десяти.
Ответ 4
Вы могли бы сделать это с помощью 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
Ответ 5
Это может сработать для вас (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
Ответ 6
Вы можете использовать awk и оболочку script. 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 на другое целое число на другую частоту.