私の意図は、コードをできるだけ単純に保つことです。これには5つのファイルがあります。
A_1.CSV, A_2.CSV, A_3.CSV, A_4.CSV, A_5.CSV
次のコードはCSVファイルの最初の行を検索します。
コード:head.sh(ファイル名)
awk -F, 'NR==1 {print $0}' A_1.CSV > Header.csv
awk -F, 'NR==1 {print $0}' A_2.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_3.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_4.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_5.CSV >> Header.csv
質問:
上記のコードでは、ファイル名のみがA_1からA_2に変更される式に進みます。ループを使ってコードを簡単にする方法
例:
for (i=1;i<=5;i++)
{
A_[i].CSV >> Header.csv
}
シェルスクリプトを使用してこのロジックを実装する方法がわかりません。
更新されたコード:
ディレクトリ内のファイル:/home/thiyagu/Desktop/
for file in 'A_*.CSV'
do
awk -F, 'NR==1 {print $0}' $file >> Newheader.csv
done
答え1
何について
awk 'FNR==1' A_*.csv > Header.csv
どこ
FNR
ファイル番号の記録ですか?- デフォルトの動作は、while行を印刷することです。
-F,
個々のフィールドに興味がないのであきらめました。 (ただし、他にやることがあれば再度追加できます。)
答え2
次のように動作します。
for file in `ls A_*.csv`
do
awk -F, 'NR==1 {print $0}' $file >> Header.csv
done
これは基本的なシェルスクリプトループです。検索すると、オンラインでこれらのチュートリアルを見つけることができます。
答え3
一重引用符は拡張を防ぎます。一重引用符で囲まれた文字列のすべての文字は文字通り解釈されます('
文字列自体を終了する文字を除く)。したがって、ワイルドカードとして機能するには、引用符の*
外に置きます。 (二重引用符は*
ワイルドカード文字の役割も防ぎます。)
for file in A_*.CSV …
更新されたコードの残りの部分は大丈夫かもしれませんが、変数置換の周りに二重引用符を追加する、そうでなければすぐにあなたを噛むでしょう。
ループの外部にリダイレクトできます。これは少し速いです。
for file in A_*.CSV
do
awk -F, 'NR==1 {print $0}' "$file"
done >> Newheader.csv
このコードスニペットはに追加されますNewheader.csv
。ファイルが既に存在する場合(元のコードなど)、上書きするには>>
を>
。
複数のファイルの最初の行だけを印刷したい場合は、スクリプトを単純化する方法があります。最初の行だけを印刷するため、-F,
使用されません。また、Linuxでは(すべてのUnixバリアントでは適用されません)、複数のファイルhead -n 1
のawk 'NR == 1 {print $0}'
最初の行のみを印刷する場合は、head
ループなしで使用できます。
head -q -n 1 A_*.CSV >Newheader.csv
awkループも必要ありません。参考アケマの答え。