Входные данные:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
Ожидаемый результат:
1
2
3
4
Итак, мне нужно иметь только 1-е, 5-е, 9-е, 13-е значение файла в выходном файле. Как это сделать?
text-processing
Велю
источник
источник
sed -n '1~4p'
Ответы:
Использование AWK:
Выяснение того, как это работает, оставлено в качестве упражнения для читателя.
источник
NR % 4 == 1
было бы более разборчивым ИМО.Использование
split
(GNU coreutils):-n
генерироватьCHUNKS
выходные файлыи
CHUNKS
какr/K/N
использовать циклическое распределение и выводить только Kth of N на стандартный вывод без разделения строк / записейисточник
С GNU
sed
:Со стандартом
sed
:С
1
и4
в$n
и$i
переменные:источник
Добавление обязательного Perl-решения:
источник
Версия на Python, просто для удовольствия:
источник
enumerate(f)
должен быть в состоянии выполнять работу, потребляя меньше памятиreadlines
(следовательно, выкладывая весь файл в память), вы можете использовать,f.readlines()[::4]
чтобы получить каждую четвертую строку. Так что вы можете использоватьprint(''.join(f.readlines()[::4]))
.POSIX sed
: этот метод использует posixly sed и поэтому может использоваться везде, или, по крайней мере, те sed, которые уважают posix.Еще одна программная генерация кода sed для масштабируемости:
Perl
: мы заполняем массив A до размера 4. Затем мы печатаем его первый элемент, а также очищаем массив.источник
Вызов с
scriptname filename skip
(4 в вашем случае). Он работает, вытягиваяiter
строки из верхней части файла и затем выводя только последние. Затем он приростыiter
поskips
и повторы тех пор , пока значениеiter
не превышаетсяlines
вfile
.источник
Чистый Баш:
mapfile - это встроенный в Bash 4 встроенный модуль, который считывает стандартный ввод в массив, названный здесь
lines
, по одной строке на запись.-t
Вариант полоски окончательного перевода строки.Если вы хотите печатать каждую четвертую строку, начиная со строки 4, то вы можете сделать это в одной команде, используя
mapfile
опцию обратного вызова-C
, которая запускает предоставленный код каждые столько строк с интервалом, заданным-c
. Текущий индекс массива и следующая назначаемая строка передаются коду в качестве аргументов.Это использует
printf
встроенный; код формата%.0s
подавляет первый аргумент (индекс), поэтому печатается только строка.Вы можете использовать ту же команду, чтобы печатать каждую четвертую строку, начиная со строки 1, 2 или 3, но вам нужно будет добавить 3, 2 или 1 строку перед
input
тем, как вводить ееmapfile
, что, я думаю, доставляет больше хлопот, чем стоит ,Это также работает:
Здесь используется
printf
четыре элемента массиваlines
за раз, только печатая первую и пропуская остальные три с помощью%.0s
. Мне это не нравится, так как вы должны вручную поиграть со строкой форматирования для разных интервалов или начальных точек.источник