2016-12-04 10 views
4

ファイルの内容を印刷し、各列にタイトルを付けて、読み込み可能なスペースを残して、新しいファイルに出力する必要があります。私はこのチュートリアルを続けてきましたが、私は立ち往生しました。Linux Awk help on code

http://www.thegeekstuff.com/2010/01/awk-introduction-tutorial-7-awk-print-examples

これは、私は私で行う必要があり、まさに私を与えることになる、彼らが使用するサンプルコードです。しかし、それを調整しても機能しません。

$ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";} 
{print $2,"\t",$3,"\t",$4,"\t",$NF;} 
END{print "Report Generated\n--------------"; 
}' employee.txt 

例とは異なり、私は文書全体を印刷したいと本当にこのそれの下でナンセンス「レポートが生成され、」したくないので、これは、私のものです。私は終わりの後に{print;} 'を追加しようとしましたが、新しい行を始めるようにしました。

どこが間違っていますか?それはちょうど終了までのENDから始まる何かをドロップアウト、最下段を削除するには、私に2

+0

見積もりがありません。ファイルの最後に何もしたくない場合は、 'END'アドレスは必要ありません。 '> awktest.txt> done'部分はあまり意味がありません。 – mustaccio

+0

閉じている ''はありません。私はあなたのシェルが 'awk'、' ''の後に始まった残りの文字列を入力するのを待っていると仮定します。 – melpomene

+0

awkチュートリアルでawkチュートリアルを書く必要がある人は誰でも書いています。それを無視して、それはナンセンスでいっぱいで、間違った足であなたを始めるでしょう。 Arnold Robbins著、Effective Awk Programming、第4版を読んでください。 –

答えて

1

を応答ソースラインを与え続けて「:

awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";} {print $2,"\t",$3,"\t",$4,"\t",$NF;}' employee.txt 

あなたの第二の例では、閉鎖を取り残さ」そして、私は必要以上にあなたが「>」1以上を置く疑う:

awk 'BEGIN {print "Firstname\tLastname\tPoints";}' awktest.txt > done 

後者の例では、しかし静かに「awktest.txt」から読んですべてを無視します。

+0

これはヘッダーだけを出力し、データは出力しません。 – e0k

+0

@ e0kどちらですか?最初の例、またはすでに入力ファイルを無視すると言われる2番目の例ですか? – melpomene

+0

はい、2番目のもの(レコードごとの句がなく、 'BEGIN'句のみのもの)はデータをリストしませんが、それはその状態を示します。 'BEGIN'節で' OFS = "\ t" 'を使うのではなく、' '\ t" 'を' print'文にすべてリストする必要はありません。 – e0k

0
それはあなたがまた、私はあなたがどんなENDアクションを必要としないことを読んで、列とソースファイルの実際の印刷を逃しているようだ

...

awk 'BEGIN {Print "Firstname\tLastname\tPoints";} END > awktest.txt > done` 

があるべき...

awk 'BEGIN {Print "Firstname\tLastname\tPoints";}{print $1,"\t",$2,"\t",$3;}' source_file.txt > awktest.txt` 

$ 1、$ 2、$ 3を必要なソースファイルのどの列に変更してください。

FYI。私は専門家で、ちょうど(awkと同様)、またはにそれはあなただけで簡単にsedで行うことができますヘッダ行を挿入している必要があるかのように見えますtuts :)

0

を読んだんcat

$ sed '1iFirstname\tLastname\tPoints' file > output.file 

又は

$ awk 'BEGIN{print "Firstname\tLastname\tPoints"} 1' file > output.file 

又は

$ cat <(echo -e "Firstname\tLastname\tPoints") file > output.file 
0

awkの印刷機能の名前はprintで、Printではありません。なぜすべての解決策が印刷文に,"\t",を含んでいるのか。あなたはそれを望んでいません - スクリプトの最初に-v OFS='\t'を設定し、次にフィールド間に,を使用するだけです。必要なのは次のとおりです。

awk -v OFS='\t' ' 
BEGIN {print "Name", "Designation", "Department", "Salary"} 
{print $2, $3, $4, $NF} 
}' employee.txt 

これらは、データから印刷したい正しいフィールド番号であると仮定します。質問のサンプルの入出力は、私たちがそれに答えるのに非常に役立ちます。