保存grep-c结果的Bash脚本

保存grep-c结果的Bash脚本,bash,Bash,我对编程一无所知,正在尝试编写我的第一个bash脚本 我有一个名为NUMBERS.txt的文件,其中包含各种数字,例如: 1000 1001 1001 1000 1002 1001 etc.. 我想编写一个脚本来计算每个数字的出现次数,将其保存为变量,并将其打印到新的文本文件中,如下所示: 1001= 3 1000= 2 etc.. 我完全卡住了 以下是我目前掌握的情况: #!/bin/bash for Count in `grep -c '1000' /NUMBERS.txt ` do

我对编程一无所知,正在尝试编写我的第一个bash脚本

我有一个名为
NUMBERS.txt
的文件,其中包含各种数字,例如:

1000
1001
1001
1000
1002
1001
etc..
我想编写一个脚本来计算每个数字的出现次数,将其保存为变量,并将其打印到新的文本文件中,如下所示:

1001= 3
1000= 2
etc..
我完全卡住了

以下是我目前掌握的情况:

 #!/bin/bash

for Count in `grep -c '1000' /NUMBERS.txt `
do
echo 'Count = '${Count}
done

for Count in `grep -c '1001' /NUMBERS.txt `
do
echo 'Count = '${Count}
done

对文件排序,然后计算每个唯一行出现的次数:

sort NUMBERS.txt | uniq -c

对文件排序,然后计算每个唯一行出现的次数:

sort NUMBERS.txt | uniq -c

现在您的文件已经在每行上有一个数字了,这就更简单了

 for i in `sort -u NUMBERS.txt ` ; do count=`grep -c "$i" NUMBERS.txt ` ; echo "$i=$count" ; done  > your_result.txt
或者以不同的格式

for i in `sort -u NUMBERS.txt `
do
    count=`grep -c "$i" NUMBERS.txt `
    echo "$i=$count"
done  > your_result.txt
如所问,性能不是很好。这里有一个更好的

sort NUMBERS.txt | uniq -c | awk '{print $1,"=",$2}'
基本上,您需要通过numbers.txt两次。第一次通过时,您将获得唯一的编号;
第二次通过时,您将计算每个唯一数字的出现次数。

现在您的文件每行已经有一个数字,这就更简单了

 for i in `sort -u NUMBERS.txt ` ; do count=`grep -c "$i" NUMBERS.txt ` ; echo "$i=$count" ; done  > your_result.txt
或者以不同的格式

for i in `sort -u NUMBERS.txt `
do
    count=`grep -c "$i" NUMBERS.txt `
    echo "$i=$count"
done  > your_result.txt
如所问,性能不是很好。这里有一个更好的

sort NUMBERS.txt | uniq -c | awk '{print $1,"=",$2}'
基本上,您需要通过numbers.txt两次。第一次通过时,您将获得唯一的编号;
第二步是计算每个唯一数字的出现次数。

我并不擅长shell脚本,但下面是一个使用bash和grep-c的有效解决方案:

#!/bin/bash

INPUT="./numbers.txt"
OUTPUT="./result.txt"

rm -f ${OUTPUT}

# you might want to change the values
for i in {1000..2000}; do
    for Count in `grep -c ${i} ${INPUT}`; do
    echo "${i} = ${Count}" >> ${OUTPUT}
    done
done

我并不擅长shell脚本,但下面是一个使用bash和grep-c的解决方案:

#!/bin/bash

INPUT="./numbers.txt"
OUTPUT="./result.txt"

rm -f ${OUTPUT}

# you might want to change the values
for i in {1000..2000}; do
    for Count in `grep -c ${i} ${INPUT}`; do
    echo "${i} = ${Count}" >> ${OUTPUT}
    done
done

它真的需要bash\grep吗?最好的方法是
sort NUMBERS.txt | uniq-c
,再加上可选的后处理以获得所需的精确格式。您想“将其保存为变量并打印”有什么具体原因吗?我想扫描整个NUMBERS.txt,计算唯一的数字,将自定义名称下的计数导出到另一个文件中。它真的需要bash\grep吗?最好的方法是
sort NUMBERS.txt | uniq-c
,加上可选的后处理,以获得您想要的确切格式。您想“将其保存为变量并打印”有什么具体原因吗?我想扫描整个NUMBERS.txt,计算唯一的数字,将自定义名称下的计数导出到另一个文件中。这是一个非常好的答案。如果你在一个awk调用上加了一个标签,你会看到:
sort NUMBERS.txt | uniq-c | awk'{print$2,“=”,$1}'
打印1000=2这样的行,这是一种可扩展的方法。如果数字增长到9位数(或更长),或者小于1000,这都无关紧要。如果需要的话,输出格式的处理也很简单(正如@twopoint718在评论中所诊断的),这是一个非常好的答案。如果你在一个awk调用上加了一个标签,你会看到:
sort NUMBERS.txt | uniq-c | awk'{print$2,“=”,$1}'
打印1000=2这样的行,这是一种可扩展的方法。如果数字增长到9位数(或更长),或者小于1000,这都无关紧要。如果需要的话,输出格式的处理也很简单(正如@twopoint718在评论中所诊断的),这对性能来说是可怕的。您不需要像此解决方案那样读取文件1000次。我提供了一个更好的解决方案。这对性能来说非常糟糕。您不需要像此解决方案那样读取文件1000次。我提供了一个更好的方法,因为我正在使用
>
操作符将每一行附加到文件中,如果您在启动脚本之前不删除它,您将有一个包含两次结果的文件。不管怎样,@John Smith的答案看起来要好得多,正如我所说,我并不擅长shell脚本编写。因为我使用
>
操作符将每一行附加到文件中,如果在启动脚本之前不删除它,则会有一个包含两次结果的文件。不管怎样,@johnsmith的答案看起来好多了,正如我所说,我并不擅长shell脚本编写。