我正在尝试从具有特定格式的文件中打印一些特定信息(文件如下: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来摆脱以“#”开头的行。 这只是代码的一部分(我相信这是问题所在)。它应该承认“ - 第一名”。由于文件中的某些字段之间会有空格,特别是在上一节(浏览器部分)中,我只想删除该部分。 这是针对学校项目的,根据对本节进行评分的程序,这一切都是错误的。尽管我已经测试过,但脚本可以正常工作(我测试了它)。我不知道这有什么问题因此我不知道该纠正什么。请帮忙!
答案 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
命令将字符串拆分为|
分隔符并返回其第三个字段。