2017-04-13 11 views
1

を使用して標準入力またはファイルからの読み込みは、これまでの私のコードです:bashの:だからここのawk

その後、どのように多くの行をテキストファイルからの行の長さを読み込み、ラインの長さを出力し、
awk '{++a[length()]} END{for (i in a) print i, a[i]}' <$1 | sort -n 

同じ長さです。

ので、入力:

hello 
guys 
hows 
it 
going 

ウィル出力:

2 1 
4 2 
5 2 

私はあまりにも標準入力持っていることができるようにしたいので、私は、コマンド「./scriptファイル名を実行することができます。 txt "を使用し、標準入力を使用してコマンドを実行することもできます。

whileループでこれを行う方法はありますか?任意のアイデア...

while read line 
do 
    awk '{++a[length()]} END{for (i in a) print i, a[i]}' <${1:-/dev/stdin} | sort -n 
done <${1:-/dev/stdin} 

が、何も正常に動作しているようだしない:私は次のように何かをしようとしましたか?

+0

あなたの代わりにどのようのものを私たちに語ったと、私たちはあなたを助けることができるかもしれないと予想出力と一緒にサンプルデータを掲載した場合。あなた自身で解決したいと同時に、stdinとawkを使ってファイルを同時に読みたい場合は、ファイルに 'getline'を使います。がんばろう。 –

+0

あなたはどういうことを言っていますか?あなたはすでにstdinから読んでいます! –

答えて

1

ダッシュ(-)をファイル名として使用できます。awkは、解析するファイルとしてstdinを使用していると認識します。たとえば:

awk '{++a[length()]} END{for (i in a) print i, a[i]}' - 

はまた、すべてでファイル名を指定しないことによって、awkはまた、標準入力

awk '{++a[length()]} END{for (i in a) print i, a[i]}' 

を使用していますそして、あなたはそれらの両方を混在させることができることに注意してください。以下は、その順序でFILE1.TXT、stdinとFILE2.TXTを処理します:

awk '{++a[length()]} END{for (i in a) print i, a[i]}' file1.txt - file2.txt 
+0

また、ほとんどのコマンドはstdinとして – kontiki

0

awkは、データをawkにパイプするときにstdinによってデフォルトで読み込むことができます。

あなたは、このように両方のファイルや標準入力からデータを読み取ることができます。

echo $'pipe1\npipe2\npipe3' | awk '{print NR, $0}' file - 

最後にダッシュがSTDINを表します。