次のように「|」で区切られた4つの列を持つファイルがあります。
23414|test doc for me||
32322|test doc for you|2004_12_03|
13454|test doc for all||2010_11_01
出力が次のように表示されるように、現在のシステム日付を空の列に挿入しようとします。
23414|test doc for me|2018_04_03|2018_04_03
32322|test doc for you|2004_12_03|2018_04_03
13454|test doc for all|2018_04_03|2010_11_01
以下は私が試したコードです
for file in `ls -rlt Added_to_* | awk '{print $9}'`
do
now="$(date +'%Y/%m/%d')"
echo "Running for: $file"
awk -F'|' -v curr="$now" '{
if( $3=="" || $4=="" ){
if ( $3=="" ) { print "$curr"}
if ( $4=="" ) { print "$curr"}
}else
do_something ;
}' $file
done
答え1
まず、ファイルのリストを読み取って処理できるため、出力をまったく解析したり、ls
シェルループを使用したりする必要はありません。awk
$curr
別の問題は、渡された変数を参照する方法ですcurr
。$curr
フィールド番号 curr
- そんなことがあったら)。また、フィールドが空であるかどうかを2回テストする必要はありません。
だから
awk -v curr="$now" '
BEGIN{OFS=FS="|";} {for(i=3;i<=4;i++) {if ($i=="") $i=curr}} {print}
' Added_to_*
答え2
我々は、置換が発生する関心位置(POI)に焦点を当てるためにLookbehind / lookahead正規表現を使用します。次に、Perl's
組み込み関数を使用して現在の日付を配置しますlocaltime
。 3番目、4番目、5番目のフィールドは、今日の日付を取得するために必要な定数を追加する日/月/年情報です。年に1 1900
、月に1、日に0を加算します。
perl -ple 's/\|\K(?=\||$)/join "_", map $_ + qw[1900 1 0][$a++%3], (localtime)[5,4,3]/eg'
答え3
sed ":a;s/|\(|\|$\)/|$(date +%Y_%m_%d)\1/;ta"
コスタスが言ったように
あなたを助ける必要があります。
PS。申し訳ありません。分割に二重ダッシュを使用しないようです。考えてみましょう...