Как выбрать столбцы данных для нового файла на основе оператора if? - PullRequest
0 голосов
/ 23 января 2019

Я поднабор данных из первоначально большого набора данных. Мне удалось выбрать число столбцов, которое я хотел для нового файла из этих исходных данных, но затем при попытке сделать дальнейший выбор на основе оператора if (требующий, чтобы столбец 28 моего нового файла включал только строки <= 5000), мой код, кажется, не сохраняет разделение полей вкладки, а также удаляет строку заголовка из моих данных. Я новичок в использовании Linux, поэтому любые рекомендации будут оценены. </p>

awk 'BEGIN{FS="\t"} { for(i=125; i<=NF; ++i) printf $i""FS; print ""}' Bigfile.txt> Smallfile.txt

awk 'BEGIN{FS="\t"} {if($28<=5000) print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$28}' Smallfile.txt > Smallfile1.txt

Первая строка awk работает нормально и выбирает всего 28 столбцов, которые я хочу, из моего исходного набора данных. Вторая строка не позволяет мне подмножество дальше. Я попытался удалить BEGIN, добавив; местами и используя -F "\ t" вместо {FS = "\ t"}

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Задача, которую вы пытаетесь выполнить, очевидно, может быть выполнена в одном скрипте awk.

Ваш первый скрипт awk выбирает все столбцы из столбца 125 и далее. Ваш второй скрипт awk делает вторичный выбор, основываясь на значении столбца 28.

Это также эквивалентно:

awk 'BEGIN{FS=OFS="\t"}
     (FNR==1) || ($(125+28-1) <= 5000) {
         for(i=125;i<=NF;++i) printf (i==125?"":OFS) $i; printf ORS
     }' BigFile > SmallFile1

Это работает, потому что awk работает с pattern { action } парами, утверждая, что pattern удовлетворено, выполните action. Здесь шаблон (FNR==1) || ($(125+28-1) <= 5000) говорит о том, что pattern удовлетворяется, если мы обрабатываем первую запись файла (FNR==1) или (||) 28-й столбец больше или равен 5000 ($(125+28-1) <= 5000).

0 голосов
/ 23 января 2019

Не могли бы вы попробовать один раз. Поскольку ваша основная проблема заключается в том, что ваш вывод НЕ поступает в формате TAB с разделителями, поэтому об этом следует позаботиться, указав значение OFS="\t" в разделе BEGIN.

Теперь перейдя ко второму вопросу, вам нужно напечатать заголовок, для которого я поставил условие FNR==1{print;next}, которое должно позаботиться о нем (FNR==1 означает, что он проверяет, равен ли номер строки 1, затем выполните следующее. Затем print напечатает 1-ю строку, next - это функция awk из коробки, которая пропустит все дальнейшие операторы отсюда). Поскольку вы не показывали образцы, я не смог их проверить.

awk 'BEGIN{FS=OFS="\t"} FNR==1{print;next} {if($28<=5000) print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$28}' Smallfile.txt > Smallfile1.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...