場所を見つけて値のリストに置き換えます。

場所を見つけて値のリストに置き換えます。

次の履歴を含むファイルがあります。

DL2016-12-02P123456             PW5038               1234561180118       123456O00400010180421          0755480            HEALTH            B   NOT APPLICABLE                                    NOT APPLICABLE     2016-08-012016-12-022016-09-012016-08-312016-09-302016-09-012016-09-30949569014            PW5018             07554800010001089200001       00100010892                   00000010304MDIRECT    00000000000000000000{          HPS                           PW5018COCOAA007708200000010304DXQ7262016001      

各行の 385-396 フィールドと 415-427 フィールドの値を書式設定したいと思います。たとえば、00000010304M 000000000000{ このコマンドcut -c 385-396,415-427 --output-delimiter=" "ファイルを使用した後です。参照00000010304M 000000000000{ ガイドなどに従って返されますM = -1。ご覧のとおり、位置396のデータはであり、位置427のデータはとに似ている必要があります。ここで、Mは-1に置き換えられます。ここで - 記号は先頭に配置され、1はM位置に配置されます。また、小数点以下2桁です。{ = +2N = +3M{-0000001030.41+00000000000.05

Last Character in Input Field|Positive or Negative|Last Number|Incoming Field|Value after replacement
{   +   0   12345{  1234.5
A   +   1   12345A  1234.51
B   +   2   12345B  1234.52
C   +   3   12345C  1234.53
D   +   4   12345D  1234.54
E   +   5   12345E  1234.55
F   +   6   12345F  1234.56
G   +   7   12345G  1234.57
H   +   8   12345H  1234.58
I   +   9   12345I  1234.59

}   -   0   12345}  -1234.5
J   -   1   12345J  -1234.51
K   -   2   12345K  -1234.52
L   -   3   12345L  -1234.53
M   -   4   12345M  -1234.54
N   -   5   12345N  -1234.55
O   -   6   12345O  -1234.56
P   -   7   12345P  -1234.57
Q   -   8   12345Q  -1234.58
R   -   9   12345R  -1234.59

ファイルにフィールド番号 396 に M が含まれている場合は、次のデータ列を使用して現在のファイルに置き換えることを示します。 00000010304Mが-0000001030.44に変更されることを意味します。参考文献では、これをM-4 12345M -1234.54とマークすることがわかります。たとえば、M文字は前に - 記号が付いている4に変わり、12345Mの代わりに-1234.54のようになります。

ベストアンサー1

開始したとおりに続行できますが、cut必要に応じてより多くの部分に分けることができます。アイデアを提供するために、各行の最初の部分を変換する短い部分があります。

cut -c 385-394,395,396 | \
while read integral dec suffix
do  case $suffix in
        '{');; # Nothing
        A) last=1;;
        B) last=2;;
        ...
        '}') sign=-;;
        J) sign=- last=1;;
        ...
    esac
    echo $sign$integral.$dec$last
done

あなたは理解しました。cut2番目の数字も含めるようにフィールドを展開します。

別のファイルを使用して最後の文字を翻訳したい場合は、grepこのインライン検索ではなくそのファイルの内容を使用できます。

おすすめ記事