Как извлечь 1-й, 3-й, 5-й группы из трех строк командой sed или awk?

Скажем, у меня есть файл:

Line1 Line2 Line3 Line4 Line5 Line6 Line7 Line8 Line9 Line10 Line11 Line12 … 

Я хочу получить:

 Line1 Line2 Line3 Line7 Line8 Line9 Line13 Line14 Line15 трубопровод Line1 Line2 Line3 Line7 Line8 Line9 Line13 Line14 Line15 

Это означает, что я хочу нечетное число из трех строк (в том числе).

У меня есть некоторые идеи, как for (i=1, i<=FR, i+5), {sed -n,'i, i+1p' } < input

Не могли бы вы рассказать мне структуру цикла for в sed. И как исправить это?

2 Solutions collect form web for “Как извлечь 1-й, 3-й, 5-й группы из трех строк командой sed или awk?”

Попробуй это

 awk 'NR % 6 == 1 || NR % 6 == 2 || NR % 6 == 3' filename.txt > output.txt 
 seq 20| sed 'n;n;n;$!N;$!N;d' 

n перезаписывает текущую строку с помощью строки ввода n ext и печатает пространство с образцом, которое оно перезаписывает (если вы не делаете sed -n или sed -e'#n' ) , поэтому мы делаем это три раза, затем мы буферизируем еще две добавленные строки ввода , и многое из них.

 1 2 3 7 8 9 13 14 15 19 20 

Другое дело, что я был так:

 sed -ne:p -e'$p;N;s/\n/&/2p;tn' -ebp \ -e:n -en \ -e:d -e'N;s/\n/&/2;t' -ebd 

Сначала буферизуют две добавленные строки ввода N ext и подсчитывают \n ewlines, добавляя и печатают, если текущая строка является последней или если буфер заполнен, а затем перезапишите эту строку ввода / вывода ext ext и еще два раза удалите буфер перед удалением это тоже.

Это также может быть написано:

 sed -ne:p -e'$p;N;s/\n/&/2p;tn' \ -ebp -e:n -e'n;n;n' 

Но преимущество в том, что вы можете легко параметризовать его так:

 altl(){ sed -ne":t$(n=0 nt='\n\t' b=$nt\b while [ "$#" -gt "$((!(n+=1)))" ] && c=${1%?} p=${1##*[!p]} \ l=$nt${p:+\$p;} p=$nt$p${p:+;}n do case $1 in (''|0*|*[!0-9]*?|*[!pd]) >&2 printf '"%s":\tARG ERR\n' "$1" kill -2 0;; (1?|?|$((c-=1))) ! :; esac && printf "\n:$n.0${l}N;%s$c;t$n.1%b" \ 's/\n/&/' "$b$n.0\n:$n.1" shift; printf %b "$p${1+\c}${nt}bt" done)" } 

На самом деле было бы нелегко сделать другой: на самом деле вам просто нужно напечатать так много [Nn] в sed чтобы это произошло. Поэтому, возможно, я потратил время на то, чтобы написать выше. Но он работает:

 ( set -x seq 150 | altl p 40d pp 10d 5p ) 

 ### This is the sed script the function's shell loop writes. ### We see it because I enabled -xtrace output on stderr. :t p;n :2.0 N;s/\n/&/39;t2.1 b2.0 :2.1 n p;n p;n :5.0 N;s/\n/&/9;t5.1 b5.0 :5.1 n :6.0 $p;N;s/\n/&/4;t6.1 b6.0 :6.1 p;n bt ### This ends the sed script. ### The rest is sed's stdout. 

 1 42 43 54 55 56 57 58 59 100 101 112 113 114 115 116 117 
  • Сравните значения столбца со всеми значениями в другом столбце
  • Регулярные команды и команды с командой sed
  • Заменить указанный символ между двумя строками?
  • Добавить строку после определенной строки в одной строке в текстовом файле
  • Использование sed для поиска и замены сложной строки (желательно с регулярным выражением)
  • Показывать только текст между двумя шаблонами соответствия
  • Bash конвертирует имена путей для sed, чтобы они избегали
  • Печатать начало и конец между двумя шаблонами, исключая конец диапазона
  • Печатать строки файла между двумя шаблонами соответствия
  • sed заменить после соответствия символа
  • Сортировка однозначно из строки
  • Linux и Unix - лучшая ОС в мире.