Рассмотрим следующие данные в файле file.txt:
$
$
$
FORCE 10 30 40
* 1 5 4
FORCE 11 20 22
* 2 3 0
FORCE 19 25 10
* 16 12 8
.
.
.
Я хочу напечатать каждый 2-й элемент третьего столбца, начиная со строки 4, в результате чего:
30
20
25
Я пытался:
Cat file.txt | sed 's/\|/ /' | awk 'NR%2==4 {print $3}'
Однако это не приводит к тому, что что-либо печатается и не генерируется никаких ошибок.
Вы можете использовать awk, проверяя, что номер строки > 3, а затем проверять четный номер строки с помощью NR%2==0.
Обратите внимание, что вам не обязательно использовать cat
awk 'NR > 3 && NR%2==0 {
print $3
}' file.txt
Выход
30
20
25
Использование sed
$ sed -En '4~2s/([^ \t]*[ \t]+){2}([^ \t]*).*/\2/p' input_file
30
20
25
Я пытался: cat file.txt | sed 's/\|/ /' | awk 'NR%2==4 {print $3}' Однако это не приводит к печати и ошибкам. генерируется либо.
Вам не нужен cat при использовании GNU sed, так как он может читать файл сам по себе, в этом случае это будет sed 's/\|/ /' file.txt.
Вы должны подумать, нужна ли вам эта часть вообще, ваш образец ввода вообще не имеет символа канала, поэтому он ничего не сделает с ним. Вы также можете удалить эту часть, если строки, содержащие значения, которые вы хотите напечатать, не содержат этого символа.
Вывод пустой, так как NR%2==4 никогда не выполняется, остаток от деления на x всегда меньше x (в частном случае %2 возможны только 2 значения: 0 и 1)
Это может сработать для вас (GNU sed):
sed -nE '4~2s/^((\S+)\s*){3}.*/\2/p' file
Отключите неявную печать, установив параметр -n, и уменьшите обратную косую черту в регулярных выражениях, включив -E.
Из четвертой строки, а затем из каждой второй строки захватите третий столбец и распечатайте его.
Н.Б. \2 представляет последнего обитателя этой обратной ссылки, что в сочетании с {3} означает указанное выше.
Альтернатива:
sed -n '4,${s/^\(\(\S\+\)\s*\)\{3\}.*/\2/p;n}' file
@Thefourthbird seq 10 | sed -n '4~2p' напечатает 4,6,8 и 10 в отдельных строках. Смотрите здесь документацию.
Я не был знаком с этой нотацией 4~2, но она начинается с 4-й строки и будет соответствовать каждой второй строке, верно? +1