Bash Shell:无限循环

时间:2016-10-13 21:50:09

标签: bash shell infinite-loop

问题是以下我有一个文件,每行都有这种形式:

id|lastName|firstName|gender|birthday|joinDate|IP|browser

我想按字母顺序对该文件中的所有名字进行排序,并在每行打印一个,但每个名称只打印一次

我创建了以下程序但由于某种原因它创建了一个无限循环:

array1=()
while read LINE
do
    if [ ${LINE:0:1} != '#' ]
    then 
        IFS="|"
        array=($LINE)
        if [[ "${array1[@]}" != "${array[2]}" ]]
        then
                array1+=("${array[2]}")
        fi
    fi
done < $3
echo ${array1[@]} | awk 'BEGIN{RS=" ";} {print $1}' | sort

注意

  • if [ ${LINE:0:1} != '#' ]:使用此命令是因为文件中有评论我不想打印

  • $3:filename

  • array1:用于所有单独的名称

1 个答案:

答案 0 :(得分:1)

哇,有一种更简单,更简洁的方法来实现这一点,而不必弄乱IFS变量或使用数组。您可以使用“for”执行此操作:

首先,我创建了一个与您的文件结构相同的文件:

$ cat file
id|lastName|Douglas|gender|birthday|joinDate|IP|browser
id|lastName|Tim|gender|birthday|joinDate|IP|browser
id|lastName|Andrew|gender|birthday|joinDate|IP|browser
id|lastName|Sasha|gender|birthday|joinDate|IP|browser
#id|lastName|Carly|gender|birthday|joinDate|IP|browser
id|lastName|Madson|gender|birthday|joinDate|IP|browser

这是我用“for”编写的脚本:

#!/bin/bash

for LINE in `cat file | grep -v "^#" | awk -F'|' '{print$3}' | sort -u`
do
        echo $LINE
done

这是这个脚本的输出:

$ ./script.sh
Andrew
Douglas
Madson
Sasha
Tim

说明:

for LINE in `cat file`

创建一个循环,读取“file”的每一行。 `之间的命令是由linux运行的,例如,如果你想将日期存储在变量中你可以使用“VARDATE =`date`”。

grep -v "^#"

选项-v用于排除与模式匹配的结果,在这种情况下,模式为“^#”。 “^”字符表示“行以”开头“。所以grep -v“^#”的意思是“排除以#开头的行。”

awk -F'|' '{print$3}'

-F选项将列分隔符从默认值(默认值为空格)切换为“之后放置的任何内容”,在本例中为“|”字符。 '{print $ 3}'打印第3列。

sort -u

“sort -u”命令按字母顺序对名称进行排序。