Как выбрать определенные столбцы с помощью командной строки perl -lane? - PullRequest
0 голосов
/ 27 декабря 2018

Командная строка ниже работает для меня

perl -F'\t' -lane'print join ",", @F[1,2]' inputfile

НО я хочу передать список переменных столбцов, не обязательно столбцов 1 и 2, как указано в @F[1,2].

ДляНапример, основываясь на общем количестве столбцов входного файла, я хотел бы выбрать случайное подмножество "$random-columns" и передать его @F[$random-columns].

Как мне это сделать?

Я попытался сначала сгенерировать columnList из 5 случайных номеров столбцов от 1 до 50:

columnList=()
for (( i = 0; i <= 5-1; ++i ))
do
    (( randCol = ($RANDOM % 50) + 1 ))
    columnList[i]=$randCol
done

Затем я сделал следующее, чтобы вставить запятую:

cols_new=$(IFS=,; echo "${columnList[*]}")

и попытался пропустить еев командной строке Perl, как показано ниже (не работает):

perl -F'\t' -lane'print join ",", @F[$cols_new]' inputfile

Ответы [ 4 ]

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

Спасибо всем большое !!Я решил проблему, следуя вашим предложениям (см. Ниже):

  • Случайным образом выбирает столбцы $ extractColumnCount из диапазона 2- $ fileColumnCount, сортирует их и помещает в $ cols_new_temp

cols_new_temp = $ (echo $ (shuf -i 2- $ fileColumnCount -n $ extractColumnCount | sort -n))

echo $ cols_new_temp

  • Здесь я добавляю запятые для разделениямассив меток столбцов и поместите его в $ cols_new

cols_new = $ (echo $ cols_new_temp | sed 's / /, / g')

echo $ cols_new

  • Этот Perl oneliner извлекает подмножество предварительно определенных случайно выбранных столбцов ($ cols_new) из файла, указанного в $ file1, добавляя первый столбец и выходной столбец.Полученный файл затем сохраняется как $ file2

output_col = 1

time perl -F ',' -lane "print join q (,), @F [split»,"$ output_col, $ cols_new]" $ file1> $ file2

0 голосов
/ 28 декабря 2018

Ваш perl -e'...$cols_new...' использует одиночные кавычки оболочки, поэтому оболочка не интерполирует переменную.

Хотя вы можете использовать интерполяцию или аргумент командной строки для получения информации из оболочки в perl oneliner, частопеременная окружения менее хлопотна:

export cols_new=1,2
perl -F'\t' -lane 'print join ",", @F[split /,/, $ENV{cols_new}]' inputfile
0 голосов
/ 28 декабря 2018

Вы можете просто выполнить генерацию случайных чисел в Perl:

perl -F'\t' -lane 'BEGIN { @cols = map int(rand 50) + 1, 1 .. 5 } print join ",", @F[@cols]' inputfile
0 голосов
/ 27 декабря 2018

Использование rand.

Пять случайных чисел от 0 до 50:

@randoms = map {int(rand(50))} 1..5;

В вашем однострочнике:

perl -F'\t' -lane 'print join ",", @F[map {int(rand(50))} 1..5]' inputfile

Чтобы использовать одинаковые индексы случайных столбцов для каждой строки, используйте блок BEGIN, который выполняется только один раз в начале программы:

perl -F'\t' -lane 'BEGIN {@rand = map {int(rand(50))} 1..5]}; print join ",", @F[@rand]' inputfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...