2017-10-11 16 views
1

特定の形式のファイルから特定の情報を印刷しようとしています(ファイルは次のとおりです:id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed ) 。 が、私は特にスクリプトを呼び出すときにこれらの引数を使用する(のがscript.shそれを呼びましょう):次のファイルについては、例えばシェルのファイルから特定の部分を印刷する

--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 

:これまで

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

私のコードは次のとおりです:

#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 

私が気づいた問題の1つは、スクリプトがコメントも印刷することです。上記は "#"で始まる行を取り除くためにgrepを使用していますが、

Carmen 
firstnames 
Mahinda 

でも印刷されます。 これはコードの一部に過ぎません(私は問題だと思っています)。それは " - ファーストネーム"を認識することになっています。ファイルのいくつかのフィールドには、最後のセクション(ブラウザセクション)にスペースが含まれているので、そのセクションだけを削除したかったのです。 これは学校プロジェクトのためのものであり、このセクションの成績を示すプログラムによれば、それはすべて間違っています。スクリプトは私が(私はそれをテストした)私が知る限りで動作します。私は何が間違っているのか分からないので、私は何を修正するのか分からない。助けてください !

+0

サンプルファイルの内容と出力方法を教えてください。見た目では、単純な 'Awk'を' awk 'BEGIN {FS = OFS = "|"}として実行できます!一意[$ 3] ++ inputFile'' – Inian

+0

'grep -vE '^#' inputFile |カット-d '|' -f3'で十分であるはずですが、同時に2つの異なる方法で処理しようとしているようです(grep/tr/cutで処理するIFS +外部ツールを使用したbashネイティブの文字列処理) – Aaron

+0

あなたの特定の質問"なぜあなたの出力にファーストネームが残っているのですか?"という問題は、ファイルの内容( 'cat" $ 3 "')からもう一度始めた次の行で 'grep -v'の結果が上書きされてしまうことです - >あなたの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コマンドは文字列を|区切り文字で分割し、その3番目のフィールドを返します。

+0

これは完全に動作しているようです。私はそれらをソートしてユニークにしたいので、 '|並べ替え|ユニック 'と働いた。答えを説明してくれてありがとう! –

+0

@DimitrisDelis 'sort -u'で十分です;) – Aaron

2

のawkは、あなたのケース

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

-F "|"のために最善のようになります。最初のヘッダ行
a[$3]++をスキップする:ファイル
FNR>1のフィールドを読みながら、フィールド区切り文字として|を設定するには、連想配列を作成します3番目のフィールド/列の文字列、つまりfirstNameにキーを置き、キーが見つかるたびに値を1ずつインクリメントします。しかし、$3の値は、!a[$3]++が真である、すなわちキーが配列に存在しない場合、またはキーが最初に読み取られていると言わなければならない場合にのみ表示されます。

+0

もう少し説明してください。 –

+1

@DimitrisDelis:答えに説明を追加しました。 – batMan

関連する問題