ループを使用してファイル名のソートを実行する方法

ループを使用してファイル名のソートを実行する方法

私の意図は、コードをできるだけ単純に保つことです。これには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 1awk 'NR == 1 {print $0}'最初の行のみを印刷する場合は、headループなしで使用できます。

head -q -n 1 A_*.CSV >Newheader.csv

awkループも必要ありません。参考アケマの答え

関連情報