2017-10-11 84 views
1

我試圖打印從文件中的某些特定信息與特定的格式(該文件如下:id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed )的文件特定部分 我要打印出來只中的firstName整理和獨特。 我特別想要調用腳本的時候使用這些參數(姑且稱之爲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來擺脫以「#」開頭的行。 這只是代碼的一部分(這是我認爲是問題的地方)。它應該承認「 - firstnames」。由於文件中的某些字段之間會有空格,特別是最後一部分(瀏覽器部分)中的空格,所以我想只刪除該部分。 這是一個學校項目,根據這部分成績的課程,這都是錯誤的。儘管我可以告訴腳本(我測試過),但腳本仍然有效。我不知道這有什麼問題,所以我不知道該糾正什麼。請幫忙 !

+0

你能告訴我們一個示例文件內容以及你需要的輸出結果嗎?通過它的外觀,你可以用一個簡單的'awk'作爲'awk'來完成BEGIN {FS = OFS =「|」}!獨特[$ 3] ++ inputFile'' – Inian

+0

'grep -vE'^#'inputFile |切-d'|' -f3'應該足夠了,它看起來像你試圖以兩種不同的方式同時做到這一點(用IFS +外部工具處理grep/tr/cut的bash本地字符串處理) – Aaron

+0

順便說一句來回答你的具體問題「爲什麼名字仍然出現在我的輸出中」,問題在於你的'grep -v'的結果被覆蓋在下一行,你再次從文件內容('cat「$ 3」')開始 - >你的grep(應該刪除註釋行)的效果被忽略 – Aaron

回答

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命令圍繞|定界符分割字符串並返回其第三個字段。

+0

這似乎是完美的。因爲我想讓他們排序和uniq我添加了| |排序| uniq',它的工作。感謝您解釋答案! –

+0

@DimitrisDelis'sort -u'應該足夠了;) – Aaron

2

AWK將是最適合你的情況

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

-F "|":設置|作爲字段分隔符,而在文件
FNR>1閱讀領域:要跳過第一頭行
a[$3]++:創建一個關聯數組將鍵作爲第三個字段/列中的字符串,即在firstName中,並在每次找到該鍵時將其值遞增1。但$3的值只有在!a[$3]++爲真時纔會打印,即當數組中不存在該鍵時,或者我應該說第一次讀取該鍵時。

+0

你能解釋一下嗎? –

+1

@DimitrisDelis:我在答案中添加了解釋。 – batMan