从 shell 中的文件中打印特定部分

Printing specific parts from a file in shell

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

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

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

--firstnames )
OlIFS=$IFS
content=$(cat "" | grep -v "#")
content=$(cat "" | 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 删除了以“#”开头的行。 这只是代码的一部分(我认为这是问题所在)。它应该识别“--firstnames”。由于文件中的某些字段之间会有空格,特别是在最后一部分(浏览器部分),我只想删除该部分。 这是一个学校项目,根据对这部分进行评分的程序,这都是错误的。据我所知,该脚本有效(我对其进行了测试)。我不知道这有什么问题,因此我不知道要纠正什么。请帮忙!

grep -vE '^#' "" | 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 命令围绕 | 分隔符和 returns 它的分隔符拆分字符串第三场.

awk 最适合您的情况

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

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