问题是以下我有一个文件,每行都有这种形式:
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
:用于所有单独的名称
答案 0 :(得分:1)
首先,我创建了一个与您的文件结构相同的文件:
$ 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”命令按字母顺序对名称进行排序。