конечный результат команды bash с точкой (.) - PullRequest
0 голосов
/ 17 мая 2018

У меня есть скрипт bash, который greps и сортирует информацию из / etc / passwd здесь

export FT_LINE1=13
export FT_LINE2=23
cat /etc/passwd | grep -v "#"  | awk 'NR%2==1' | cut -f1 -d":" | rev | sort -r | awk -v l1="$FT_LINE1" -v l2="$FT_LINE2" 'NR>=l1 && NR<=l2' | tr '\n' ',' | sed 's/, */, /g'

Результатом является этот список

sstq_, sorebrek_brk_, soibten_, sirtsa_, sergtsop_, sec_, scodved_, rlaxcm_, rgmecived_, revreswodniw_, revressta_,

Как мне заменить последнюю запятую на точку (.)? Я хочу, чтобы это выглядело так

sstq_, sorebrek_brk_, soibten_, sirtsa_, sergtsop_, sec_, scodved_, rlaxcm_, rgmecived_, revreswodniw_, revressta_.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

В вашей команде есть множество каналов, некоторые из них можно удалить.

Как объяснено в комментарии cat <FILE> | grep это плохая привычка !!!В общем случае cat <FILE> | cmd следует заменить на cmd <FILE> или cmd < FILE в зависимости от того, какой тип аргументов принимает ваша команда.

При обработке файла размером в несколько ГБ вы уже почувствуете разницу.

При этом можно выполнить всю обработку без использования одного канала, например, используя awk:

awk  -v l1="$FT_LINE1" -v l2="$FT_LINE2" 'function reverse(s){p=""; for(i=length(s); i>0; i--){p=p substr(s,i,1);}return p;}BEGIN{cmp=0; FS=":"; ORS=","}!/#/{cmp++;if(cmp%2==1) a[cmp]=reverse($1);}END{asort(a);for(i=length(a);i>0;i--){if((length(a)-i+1)>=l1 && (length(a)-i)<=l2){if(i==1){ORS=".";}print a[i];}}}' /etc/passwd

Пояснения:

# BEGIN rule(s)

BEGIN {
        cmp = 0   #to be use to count the lines since NR can not be used directly
        FS = ":"  #file separator :
        ORS = "," #output record separator ,
}

# Rule(s)

! /#/ { #for lines that does not contain this char  
        cmp++ 
        if (cmp % 2 == 1) { 
                a[cmp] = reverse($1) #add to an array the reverse of the first field
        }
}

# END rule(s)

END {
        asort(a) #sort the array and process it in reverse order

        for (i = length(a); i > 0; i--) {
                # apply your range conditions
                if (length(a) - i + 1 >= l1 && length(a) - i <= l2) { 
                        if (i == 1) { #when we reach the last character to print, instead of the comma use a dot
                                ORS = "." 
                        }
                        print a[i] #print the array element
                }
        }
}


# Functions, listed alphabetically
#if the reverse operation is necessary then you can use the following function that will reverse your strings.
function reverse(s)
{
        p = ""
        for (i = length(s); i > 0; i--) {
                p = p substr(s, i, 1)
        }
        return p
}

Если вам не нужна партия reverse, вы можете просто удалить ее из сценария awk.

В конце концов, не используется ни одна труба !!!

0 голосов
/ 17 мая 2018

Вы можете добавить:

| sed 's/,$/./'

(где $ означает «конец строки»).

...