数字をゼロで埋める

数字をゼロで埋める

私のスクリプト形式が機能するには、grepの結果に0を追加する必要がありますが、どうすればよいかわかりません。私のgrepの結果は次のとおりです。

261 : 261 = 0 | 1192 : 1184 = 8 | 
283 : 283 = 0 | 666 : 659 = 7 | 
267 : 267 = 0 | 631 : 620 = 11 |  
283 : 283 = 0 | 787 : 781 = 6 | 
278 : 279 = -1 | 963 : 957 = 6 |

出力が次のようになります。

261 : 261 = 000  | 1192 : 1184 = 0008 |   
283 : 283 =  000  | 0666 : 0659 = 0007 | 
267 : 267 =  000  | 0631 : 0620 = 0011 | 
283 : 283 =  000  | 0787 : 0781 = 0006 | 
278 : 279 = -001  | 0963 : 0957 = 0006 |

この結果を得るには、次のスクリプトを使用してください。

count100=`grep -ach "0100 $GivenBIN" $line`
count110=`grep -ach "0110 $GivenBIN" $line`
filename=`echo $line | awk -F"/" '{print $NF}'`
echo -e "$filename     $count100 : $count110 = $ans1| $count220 : $count230 = $ans4 |" 

答え1

あなたの入力と出力の例に基づいて、私の考えでは

  • 数値列は常にスペースで区切られます。
  • 各数値列の型を既知の固定幅で指定しようとしています。
  • 与えられた各列の各行が同じ桁数を持つことを望みます。
  • 列には先行記号(スペースまたは-)があります。

printfこれは、各数値列に書式を適用する次のawkスクリプトに変換されます。

awk 'BEGIN {
    widths[1]=widths[3]=3;
    widths[5]=" 4";
    widths[7]=widths[9]=widths[11]=4
}
{
    for (i in widths) $i = sprintf("%0" widths[i] "d", $i);
    print
}'

答え2

これは4つのsed式です。長いが単純
に前にゼロを追加し、左と右の数字をそれぞれ3と4の長さに切り捨てます。
このようなものを1行で書くのは難しいですが、コードの最後のセクションに示すように、複数行にわたって配置するのは非常に簡単です...
printf可能解決策ですが、負のため最初に考えたほど簡単ではありません。あなたの要件は、すべての負の数が正の数と同じ桁数でなければならないことです。
だから、このsedメソッドはうまくいくので廃棄していますが、より簡単な解決策があるかもしれません...

sed -r -e "s/^([0-9]+)( : )([0-9]+)( = )(-)?([0-9]+)( )/00\1\200\3\4\500\6\7/" -e "s/0*([0-9][0-9][0-9])( : )0*([0-9][0-9][0-9])( = )(-)?0*([0-9][0-9][0-9])( )/\1\2\3\4\5\6\7/" -e "s/( )([0-9]+)( : )([0-9]+)( = )(-)?([0-9]+)( .)$/\1000\2\3000\4\5\6000\7\8/" -e "s/( )0*([0-9][0-9][0-9][0-9])( : )0*([0-9][0-9][0-9][0-9])( = )(-)?0*([0-9][0-9][0-9][0-9])( .)$/\1\2\3\4\5\6\7\8/" \
<<'EOF'
261 : 261 = 0 | 1192 : 1184 = 8 |
283 : 283 = 0 | 666 : 659 = 7 |
267 : 267 = 0 | 631 : 620 = 11 |
283 : 283 = 0 | 787 : 781 = 6 |
278 : 279 = -1 | 963 : 957 = 6 |
278 : 279 = -1 | 963 : 954 = -1 |
EOF

これが出力です

261 : 261 = 000 | 1192 : 1184 = 0008 |
283 : 283 = 000 | 0666 : 0659 = 0007 |
267 : 267 = 000 | 0631 : 0620 = 0011 |
283 : 283 = 000 | 0787 : 0781 = 0006 |
278 : 279 = -001 | 0963 : 0957 = 0006 |
278 : 279 = -001 | 0963 : 0954 = -0001 |

これはsed式のより読みやすいバージョンです。

sed -r \
-e "s/^\
([0-9]+)( : )\
([0-9]+)( = )(-)?\
([0-9]+)( )\
/00\1\200\3\4\500\6\7/" \
-e "s/\
0*([0-9][0-9][0-9])( : )\
0*([0-9][0-9][0-9])( = )(-)?\
0*([0-9][0-9][0-9])( )\
/\1\2\3\4\5\6\7/" \
-e "s/( )\
([0-9]+)( : )\
([0-9]+)( = )(-)?\
([0-9]+)( .)$\
/\1000\2\3000\4\5\6000\7\8/" \
-e "s/( )\
0*([0-9][0-9][0-9][0-9])( : )\
0*([0-9][0-9][0-9][0-9])( = )(-)?\
0*([0-9][0-9][0-9][0-9])( .)$\
/\1\2\3\4\5\6\7\8/" \

答え3

使用できる 印刷機能 コマンド:最初の引数は型文字列で、その後に各型指定子に対して1つずつ型文字列に挿入される追加の引数が続きます。

文字列を印刷するための書式指定子はです%s。印刷にはオプションで、%d合計桁数(4)、0パディングに使用される先行文字を書式設定できます%04d。必要に+応じて、文字数が負の場合にのみ記号を印刷するには、後に空白文字()を追加します。また、行の最後の端を印刷するには、通常どおりフォーマット文字列を終了する必要があります。%%\necho

より印刷(3)全リストのマニュアルページです。

たとえば、次のようになります。

count100=grep -ach "0100 $GivenBIN" $line
count110=grep -ach "0110 $GivenBIN" $line
filename=echo $line | awk -F"/" '{print $NF}'
printf '%s %d : %d = % 03d | %s : %d = %04d\n' "$filename" "$count100" "$count110" "$ans1" #...

目的の形式で行を印刷します。

関連情報