Как вывести каждую n-ю запись m-го столбца, начиная с определенной строки файла?

Рассмотрим следующие данные в файле 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}'

Однако это не приводит к тому, что что-либо печатается и не генерируется никаких ошибок.

Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
1
0
52
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете использовать 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

Я не был знаком с этой нотацией 4~2, но она начинается с 4-й строки и будет соответствовать каждой второй строке, верно? +1

The fourth bird 18.02.2023 11:23

@Thefourthbird seq 10 | sed -n '4~2p' напечатает 4,6,8 и 10 в отдельных строках. Смотрите здесь документацию.

potong 18.02.2023 14:51

Другие вопросы по теме