以下のファイルがあります。 $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