как подавить перевод строки в awk
Ниже я предлагаю 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
Ответы
$ 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
Не могли бы вы попробовать следовать, исправляя попытку 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.
Вы можете указать 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)