как подавить перевод строки в awk

Dec 04 2020

Ниже я предлагаю awkсценарий, но он генерирует много нежелательных файлов LF. Интересно, как подавить (контролировать) вывод LFв этом скрипте. Заранее благодарим за добрый совет.

awk '
BEGIN{
    FS=OFS=","
}
{
    nf=NF
    s=0 # initialization
        if($1==3){print "1,"; s+=50}else{print "0,"} if($2==1){print "1,"; s+=50}else{print "0,"}
        print s
        print ","
}END{}' file

Содержимое файла (файла) выглядит примерно так:

3,1
3,2

В этом случае результат такой:

1,
1,
100
,
1,
0,
50
,

Это очень неуклюже. Мой желаемый результат похож на

1,1,100
1,0,50

Ответы

3 AkshayHegde Dec 04 2020 at 13:00
$ cat input 3,1 3,2 $ awk 'BEGIN{FS=OFS=","}{c1=c2=sum=0;}$1==3{c1=1;sum+=50}$2==1{c2=1;sum+=50}{print c1,c2,sum}' input 
1,1,100
1,0,50

Лучше читаемость:

awk 'BEGIN{
       FS=OFS=","
     }
     {
        c1=c2=sum=0;          # reset variables
     }
     $1==3{ # if col1 equal to 3 then c1=1; sum+=50 } $2==1{                    # if col2 equal to 1 then
       c2=1;
       sum+=50
    }
    {
        print c1,c2,sum       # print variables 
    }' input    
3 RavinderSingh13 Dec 04 2020 at 12:55

Не могли бы вы попробовать следовать, исправляя попытку OP здесь. Исправлено и протестировано в GNU awk.

awk '
BEGIN{
    FS=OFS=","
}
{
   s=0
   if($1==3){s+=50;$1="1"} else{$1="0"} if($2==1){s+=50;$1="1"} else{$2="0"}
   print $0,s
}' Input_file

Исправления в попытках ОП:

  • Удаленная nfпеременная не нужна.
  • Нам НЕ нужно печатать как можно скорее, когда выполняется условие, поэтому проблема возникает на выходе, скорее мы можем сохранить значения в полях (например, -> 1-е и 2-е поля) и, наконец, напечатать строку с переменной.

Пояснение: Добавление подробного объяснения вышеизложенного.

awk '                                       ##Starting awk program from here.
BEGIN{                                      ##Starting BEGIN section of this program from here.
    FS=OFS=","                              ##Setting FS and OFS as comma here.
}
{
   s=0                                      ##Setting s as 0 here.
   if($1==3){s+=50;$1="1"} else{$1="0"}     ##Checking if 1st field is 3 then add 50 to s and set 1 to $1 else keep $1 as 0 here.
   if($2==1){s+=50;$1="1"} else{$2="0"} ##Checking if 2nd field is 3 then add 50 to s and set 1 to $2 else keep $2 as 0 here. print $0,s                               ##Printing line and value of s here.
}' Input_file                               ##mentioning Input_file name here.
Daweo Dec 04 2020 at 16:19

Вы можете указать AWKне ставить новую строку после каждого print, установив ORSна "", но тогда вам нужно будет поместить новую строку самостоятельно там, где это необходимо. Ваш код может быть переработан следующим образом:

awk '
BEGIN{
    ORS="";FS=OFS=","
}
{
    nf=NF
    s=0 # initialization
        if($1==3){print "1,"; s+=50}else{print "0,"} if($2==1){print "1,"; s+=50}else{print "0,"}
        print s
        print "\n"
}END{}' file

затем для fileсодержания

3,1
3,2

он выведет:

1,1,100
1,0,50

(проверено в gawk 4.2.1)