Умножение столбцов x-end при сохранении файловой структуры

Используя vipeиз moreutils . Демо с seq 20вместо wget.

Запустить:

seq 20 | EDITOR=less vipe | wc -l

...и lessоткрывает канал для просмотра. Нажмите от qдо , выйдите из less, и появится счетчик строк из wc -l:

.

20

Теперь сделайте то же самое:

seq 20 | EDITOR=less vipe | wc -l

... но на этот раз нажмите Ctrl -C , затем qдо выйдитеless. Из-за Ctrl -C , wcникогда не запускается.

Следовательно, это должно работать:

wget -qO- https://some-site.com/some-file.sh | EDITOR=less vipe | bash 

А если код не устраивает, нажмите Ctrl -C .

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

wget -qO- https://some-site.com/some-file.sh | tee /tmp/some-file.sh |
EDITOR=less vipe | bash 

... и это будет работать почти так же, за исключением того, что /tmp/some -file.sh также будет иметь содержимое канала.

3
16.08.2019, 03:34
3 ответа

Вам просто нужно установить разделитель полей вывода (OFS), например.:

awk '{ for (i=3; i<=NF; i++) $i*=2 } 1' FS=, OFS=, infile

Или используя вашу формулу:

awk '{ for (i=3; i<=NF; i++) $i = 2*(2*($i-1)+1) } 1' FS=, OFS=, infile

Выход:

A,22,2,4,6,8,10
G,26,10,12,14
X,28,20,40,20

1в конце скрипта — это короткая -рука для{ print $0 }

7
27.01.2020, 21:11

Perl может захватывать, как показано на рисунке :По предложению @Thor:

$ perl -F, -anE '$,="," ; say splice(@F,0,2), map { 2*(2*($_-1)+1) } @F' inp.csv

Использование другого подхода:

$ perl -lpe '
   /^[^,]*,[^,]*/g; #positions the search engine before the 2nd comma.
   s/\G,\K([^,]*)/2*(2*($1-1)+1)/ge;
' inp.csv

Утилита настольного калькулятора GNU может сделать это как:

$ < inp.csv tr ',-'  ' _' | sed -Ee 's/\S+/[&]/' |
    dc -e "
     [q]sq
     [44an]s,
     [1-2*1+2*]s=
     [SM lN1+sN z0<a]sa
     [LMnl,x LMnl,x lN2-sN]sb
     [LMl=xn lN1<, lN1-dsN0<c]sc
     [?z0=q 0sN lax lbx lcx 10an z0=?]s?
     l?x
"

Это простые утилиты и пояснения по запросу, так как это простые и понятные коды.

Краткое пояснение:

Утилита dcработает со стеком, где она хранит свои данные в виде кода. Отсюда он сохраняет n извлечений в регистрах.

Строковые данные заключены в квадратные скобки.

Отсечение выполняется с помощью рекурсии.

В этом постоянном коде имеется 7 регистров, хранящих код, а именно, q =, a b c ?

Два регистра M N хранят данные.

Вяжите в обратном направлении от конца. Код прописать? выполняет действие чтение следующей строки из ввода. Затем сравнивает, сколько элементов, разделенных пробелами, находится в его стеке; думайте о них как о полях. В случае 0 остановить и выйти. Фрагмент z0=q делает это. Он читается как :z is dc команда для возврата количества присутствующих элементов. То, что мы сравниваем с 0, и если равно, выполняется код, хранящийся в регистре q.

2
27.01.2020, 21:11
s=`awk '{print NR}' p.txt| sort -nr | sed -n '1p'`
praveen@praveen:~$ for ((i=1;i<=$s;i++)); do m=`awk -v i="$i" -F "," 'NR==i{print NF}' p.txt`; for ((u=1;u<=$m;u++)); do if [[ $u < 3 ]]; then awk -v  i="$i" -v  u="$u" -F ","  'NR==i{print $u}'  p.txt; else awk -v i="$i" -v u="$u" -F "," 'NR==i {print 2*$u}' p.txt; fi; done| sed "N;s/\n/,/g"| sed "N;s/\n/,/g"| sed "N;s/\n/,/g"; done

where p.txt is filename



A,22,2,4,6,8,10
G,26,10,12,14
X,28,20,40,20
-1
27.01.2020, 21:11

Теги

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