从shell

时间:2017-10-11 14:13:20

标签: string bash shell unique

我正在尝试从具有特定格式的文件中打印一些特定信息(文件如下:id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed ) 我想打印出第一个已排序且唯一的名称。 我特别想在调用脚本时使用这些参数(让我们称之为script.sh):

./script.sh --firstnames -f <file>

到目前为止,我的代码如下:

--firstnames )
OlIFS=$IFS
content=$(cat "$3" | grep -v "#")
content=$(cat "$3" | tr -d " ") #cut -d " " -f6 )
for i in $content
do

IFS="|"
first=( $i ) 
echo ${first[2]}
IFS=$OlIFS
done | sort | uniq
;;
esac

例如,对于以下文件:

#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.12|Firefox
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58:781+0000|81.25.252.111|Internet Explorer

应该有输出:

Carmen
Mahinda

我注意到的一个问题是脚本也会打印注释。以上将打印:

Carmen
firstnames
Mahinda

即使我使用grep来摆脱以“#”开头的行。 这只是代码的一部分(我相信这是问题所在)。它应该承认“ - 第一名”。由于文件中的某些字段之间会有空格,特别是在上一节(浏览器部分)中,我只想删除该部分。 这是针对学校项目的,根据对本节进行评分的程序,这一切都是错误的。尽管我已经测试过,但脚本可以正常工作(我测试了它)。我不知道这有什么问题因此我不知道该纠正什么。请帮忙!

2 个答案:

答案 0 :(得分:3)

awk 最适合您的情况

$ awk -F "|" 'FNR>1 && !a[$3]++{print $3}' file | sort
Carmen
Mahinda

-F "|":在阅读文件
中的字段时将|设置为字段分隔符 FNR>1:跳过第一个标题行
a[$3]++:创建一个关联数组,其中键作为第3个字段/列中的字符串,即firstName,并在每次找到键时将其值增加1。但是,$3的值仅在!a[$3]++为真时打印,即当数组中不存在该键时,或者我应该说第一次正在读取该键。

答案 1 :(得分:1)

grep -vE '^#' "$3" | cut -d'|' -f3应该足够了:

$ echo '#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
> 933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.12|Firefox
> 1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58:781+0000|81.25.252.111|Internet Explorer
>' | grep -vE '^#' | cut -d'|' -f3
Mahinda
Carmen

grep命令删除以 #开头的行(它使用正则表达式来执行-E标记;如果要继续删除任何行包含#的行,您当前的grep -v #是正确的),cut -d'|' -f3命令将字符串拆分为|分隔符并返回其第三个字段。