带有点(。)的bash命令的最终结果

时间:2018-05-17 00:33:25

标签: bash shell sorting unix grep

我有一个bash脚本,可以从/ 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 :(得分:3)

您可以添加:

| sed 's/,$/./'

(其中$表示“行尾”)。

答案 1 :(得分:1)

您的命令中有许多管道,其中一些可以删除。

正如评论中所解释的cat <FILE> | grep坏习惯!通常,cat <FILE> | cmd应替换为cmd <FILE>cmd < FILE,具体取决于您的命令接受的参数类型。

在要处理的几个GB大小的文件上,您已经感受到了不同。

话虽如此,您可以使用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脚本中删除即可。

最后,没有使用过一个管道!!!