Я имею файл, говорю 'test.txt' с:
5 80
3 70
4 60
Теперь я хочу создать график R, который похож на лестницу/шаги: y-значение 80 для 5 точек данных, затем y-значение 70 для 3 точек данных и затем y-значения 60 для 4 точек данных, чего-то вроде этого:
Как я мог преобразовать test.txt
кому: transformed.txt
:
80
80
80
80
80
70
70
70
60
60
60
60
на оболочке, или, альтернативно непосредственно печатают график в R от test.txt
.
AWK хорош для этого:
awk '{while ($1-- > 0) print $2}' test.txt
Это интерпретирует каждую строку test.txt
как запись полей, разделенных пробелами. Это считает в обратном порядке (--
) от значения первого поля ($1
), пока то значение не является нулем, печатая значение второго поля ($2
) на его собственной строке каждый раз.
Одно из преимуществ этого метода - то, что он автоматически терпит дополнительный пробел прежде, промежуточный, или после чисел.
Конкретно:
$1
и $2
первые и вторые поля. while
- цикл оценивает выражение $1-- > 0
. Если это верно, то print $2
выполнения, то запускается снова . $1--
уменьшает значение первого поля одним. (Это происходит в памяти; фактический файл text.txt
никогда не изменяется.), Но это возвраты значение $1
имело непосредственно перед тем, как это было уменьшено. См. Простофиля: Эффективное Программирование AWK, разделите 6.2.4 Инкрементных и Оператора понижения для более полного объяснения. , Если Вы предпочитаете, можно вместо этого использовать 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
Использование Perl:
perl -pe 's/(\d+) (\d+\n)/$2 x $1/e' foo
Здесь:
-pe
выполнения выражение на каждой строке, автоматически печатая его впоследствии (\d+)
соответствия строка цифр, и (\d+\n)
соответствия строка цифр с новой строкой $2 x $1
копирует вторую подобранную группу так же много раз как значение первой подобранной группы. /e
говорит Perl, что замена должна также быть оценена как выражение