ファイルの各行の固定位置を変更する方法

ファイルの各行の固定位置を変更する方法

以下のファイルがあります。 $number(位置19-30)と(位置59-70)をセント単位の数字に置き換える方法は?

更新:すべてのフィールドは同じ固定位置になければなりません。

入力する:

asfdassdfasfasfas    1,719.41 23:55:51 016250    9003286     1,719.41    24.64DR 381000
safsdfoskjshfkkdf      184.00 23:57:53 019516    9007963       184.00     2.94DR 384000
agereafdfbfbgsdgd    1,168.00 23:59:55 012229    9002950     1,168.00     3.54DR 0000 

希望の出力:

asfdassdfasfasfas      171941 23:55:51 016250    9003286       171941    24.64DR 381000
safsdfoskjshfkkdf       18400 23:57:53 019516    9007963        18400     2.94DR 384000
agereafdfbfbgsdgd      116800 23:59:55 012229    9002950       116800     3.54DR 0000  

ここに画像の説明を入力してください。

答え1

古いawk

入力に固定フィールド幅を使用し、必要に応じてフィールドを切り取り、元の幅で埋め直します$2$4

awk 'BEGIN {FIELDWIDTHS = "19 11 29 11 30"} {
     gsub(/\.|,/,"",$4); gsub(/\.|,/,"",$2);
     printf "%s%11s%s%11s%s\n", $1, $2, $3, $4, $5
}' file1

文字の削除は、状況によって変わらず、削除される文字の数に関係なく、フィールドが常に正しい幅で埋められるため、これは一般的な解決策である必要があります(11)。

ゲジン

cat file1
asfdassdfasfasfas    1,719.41 23:55:51 016250    9003286     1,719.41    24.64DR 381000
safsdfoskjshfkkdf      184.00 23:57:53 019516    9007963       184.00     2.94DR 384000
agereafdfbfbgsdgd    1,168.00 23:59:55 012229    9002950     1,168.00     3.54DR 0000 

ガジュット

asfdassdfasfasfas      171941 23:55:51 016250    9003286       171941    24.64DR 381000
safsdfoskjshfkkdf       18400 23:57:53 019516    9007963        18400     2.94DR 384000
agereafdfbfbgsdgd      116800 23:59:55 012229    9002950       116800     3.54DR 0000

答え2

修正する:新しい質問については、正しい入力シナリオでのみ機能する次のことを試してください。

sed -Ee 's/([0-9]),([0-9]{3})./  \1\2/g;s/ ([0-9]{3})\./  \1/g' <<inputFile>>

出力: 。

$ sed -Ee 's/([0-9]),([0-9]{3})./  \1\2/g;s/ ([0-9]{3})\./  \1/g'  temp.txt 
asfdassdfasfasfas      171941 23:55:51 016250    9003286       171941    24.64DR 381000
safsdfoskjshfkkdf       18400 23:57:53 019516    9007963        18400     2.94DR 384000
agereafdfbfbgsdgd      116800 23:59:55 012229    9002950       116800     3.54DR 0000 

    $ head -1 temp.txt 
    asfdassdfasfasfas    1,719.41 23:55:51 016250    9003286     1,719.41    24.64DR 381000
    $ head -1 temp.txt  | wc -c
    88
    $ sed -Ee 's/([0-9]),([0-9]{3})./  \1\2/g;s/ ([0-9]{3})\./  \1/g' | head -1
    asfdassdfasfasfas      171941 23:55:51 016250    9003286       171941    24.64DR 381000
    $ sed -Ee 's/([0-9]),([0-9]{3})./  \1\2/g;s/ ([0-9]{3})\./  \1/g' temp.txt | head -1 | wc -c
    88

(一般的な)各列の値を文字列全体ではなくフィールドとして扱うことで、awkを使用できます。

awk  '{gsub(",",""); $2=$2*100;$6=$6*100; }1' <<inputFile>>  | rev | column -t | rev

出力:

asfdassdfasfasfas   171941  23:55:51    016250  9003286 171941  24.64DR 381000  
safsdfoskjshfkkdf   18400   23:57:53    019516  9007963 18400   2.94DR  384000  
agereafdfbfbgsdgd   116800  23:59:55    012229  9002950 116800  3.54DR  0000    

関連情報