ファイルの日付をファイルの最初の列で埋めるUnixシェルスクリプト

ファイルの日付をファイルの最初の列で埋めるUnixシェルスクリプト
  1. abc.dat次のように、最初のレコードを含むファイル名があります。
    01|06/30/2020|test.txt. 
    
  2. ファイルの残りの部分には、次のレコードが含まれています。
    123456|Alpha|....... 
    134567|Beta|.... 
    ................
    
  3. これで、ファイルから06/30/2020最初のレコードを取得したのMMDDYYYYと同じ形式に変換し06302020、最初のレコードを除くファイルの最初の列にする必要があります。
  4. 出力:予想される出力は次のとおりです。
    01|06/30/2020|test.txt 
    06302020|123456|Alpha|..........
    06302020|134567|Beta|...........
    ................................
    
  5. 次のコードを試してみました。
    for file in `ls abc.dat`
    do
        #Gets filename for each row
        # echo "file = $file"
        rec=`wc -l $file`
        rec_cnt=`echo $rec | cut -f1 -d" "`
        #echo "Record Count = $rec_cnt"
        #extract the month end date from the first line from file
        month_end_date=`head -1 $file|tr -d '/'|cut -f2 -d"|"`
        #echo "month end date is $month_end_date"
        awk -F"|" '{if(NR == 1) printf ("%s\n",$0)
            else{ if ('$month_end_date' == $1) printf("%s\n",$0)
                else printf ("%s|%s\n",'$month_end_date',$0)} }'
    done
    

答え1

awkデフォルトでは、複数のファイルをコマンドライン引数として処理できるため、シェルループから呼び出す必要はほとんどありません。しかもループコンテンツファイルを読み取って個々の行を渡すことは非常に非効率的であるため、お勧めできません。

実際、全体の機能はawkプログラムとして実装することができます。

awk '
    BEGIN {OFS=FS="|"}
    FNR==1 {d=gensub("/","","g",$2); print;}
    FNR>1 {print d,$0}
' abc.dat

説明する:

  • 各ファイルの最初の行で関数を使用して、すべてのフィールドが空の文字列で置き換えられた(つまり削除された)gensub()2番目のフィールド(日付を含む)のコピーを作成します。/
  • すべての後続の行で、この変更されたコピーは元の行の内容の前に追加されます。

関連情報