abc.dat
次のように、最初のレコードを含むファイル名があります。01|06/30/2020|test.txt.
- ファイルの残りの部分には、次のレコードが含まれています。
123456|Alpha|....... 134567|Beta|.... ................
- これで、ファイルから
06/30/2020
最初のレコードを取得したのMMDDYYYY
と同じ形式に変換し06302020
、最初のレコードを除くファイルの最初の列にする必要があります。 - 出力:予想される出力は次のとおりです。
01|06/30/2020|test.txt 06302020|123456|Alpha|.......... 06302020|134567|Beta|........... ................................
- 次のコードを試してみました。
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番目のフィールド(日付を含む)のコピーを作成します。/
- すべての後続の行で、この変更されたコピーは元の行の内容の前に追加されます。