Как я могу повторить каждое текстовое поле в столбце количество раз, данное в другом столбце?

Я имею файл, говорю 'test.txt' с:

5 80  
3 70  
4 60  

Теперь я хочу создать график R, который похож на лестницу/шаги: y-значение 80 для 5 точек данных, затем y-значение 70 для 3 точек данных и затем y-значения 60 для 4 точек данных, чего-то вроде этого:

stairs plot example

Как я мог преобразовать test.txt кому: transformed.txt:

80  
80  
80  
80  
80  
70  
70  
70  
60  
60  
60  
60  

на оболочке, или, альтернативно непосредственно печатают график в R от test.txt.

3
задан 12 March 2017 в 08:20

2 ответа

AWK хорош для этого:

awk '{while ($1-- > 0) print $2}' test.txt

Это интерпретирует каждую строку test.txt как запись полей, разделенных пробелами. Это считает в обратном порядке (--) от значения первого поля ($1), пока то значение не является нулем, печатая значение второго поля ($2) на его собственной строке каждый раз.

Одно из преимуществ этого метода - то, что он автоматически терпит дополнительный пробел прежде, промежуточный, или после чисел.

Конкретно:

, Если Вы предпочитаете, можно вместо этого использовать for - цикл :

awk '{for (; $1 > 0; --$1) print $2}' test.txt

Или со специализированным счетчиком цикла переменная :

awk '{for (i = $1; i > 0; --i) print $2}' test.txt

Или если Вы находите это более интуитивным для подсчета вместо вниз, можно сделать это:

awk '{for (i = 0; i < $1; ++i) print $2}' test.txt
3
ответ дан 1 December 2019 в 13:16

Использование Perl:

perl -pe 's/(\d+) (\d+\n)/$2 x $1/e' foo

Здесь:

  • -pe выполнения выражение на каждой строке, автоматически печатая его впоследствии
  • (\d+) соответствия строка цифр, и (\d+\n) соответствия строка цифр с новой строкой
  • Затем $2 x $1 копирует вторую подобранную группу так же много раз как значение первой подобранной группы. /e говорит Perl, что замена должна также быть оценена как выражение
Perl
5
ответ дан 1 December 2019 в 13:16

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

Похожие вопросы: