В месте редактирования для выравнивания столбца - PullRequest
0 голосов
/ 10 марта 2020

Я хочу выровнять столбец следующего файла.

cat input.dat 
0.1     0.22474401451476203     0.22474401451476203     0.22468184471725106     0.22474401451476203     0.22474466451476202
0.15000000000000002     0.09328229408835575     0.09328229408835575     0.09323107184876382     0.09328229408835575     0.09328294408835575
0.2     0.04700471936101653     0.04700471936101653     0.04696126453738079     0.04700471936101653     0.04700536936101653
0.25    0.025562449852510022    0.025562449852510022    0.025525019904759787    0.025562449852510022    0.02556309985251002
0.30000000000000004     0.013916483625141736    0.013916483625141736    0.013883976359424946    0.013916483625141736    0.013917133625141737
0.35    0.006918972749219993    0.006918972749219993    0.0068906275518585275   0.006918972749219993    0.006919622749219994
0.4     0.0024319065284844395   0.0024319065284844395   0.002407166678723833    0.0024319065284844395   0.0024325565284844396
0.45000000000000007     -0.0005564879581991863  -0.0005564879581991863  -0.0005780476659970637  -0.0005564879581991863  -0.0005558379581991862
0.5     -0.0025717430483357794  -0.0025717430483357794  -0.0025904580222108962  -0.0025717430483357794  -0.0025710930483357794

Я могу сделать как (и ожидаемый результат):

cat input.dat | column -t


0.1                  0.22474401451476203     0.22474401451476203     0.22468184471725106     0.22474401451476203     0.22474466451476202
0.15000000000000002  0.09328229408835575     0.09328229408835575     0.09323107184876382     0.09328229408835575     0.09328294408835575
0.2                  0.04700471936101653     0.04700471936101653     0.04696126453738079     0.04700471936101653     0.04700536936101653
0.25                 0.025562449852510022    0.025562449852510022    0.025525019904759787    0.025562449852510022    0.02556309985251002
0.30000000000000004  0.013916483625141736    0.013916483625141736    0.013883976359424946    0.013916483625141736    0.013917133625141737
0.35                 0.006918972749219993    0.006918972749219993    0.0068906275518585275   0.006918972749219993    0.006919622749219994
0.4                  0.0024319065284844395   0.0024319065284844395   0.002407166678723833    0.0024319065284844395   0.0024325565284844396
0.45000000000000007  -0.0005564879581991863  -0.0005564879581991863  -0.0005780476659970637  -0.0005564879581991863  -0.0005558379581991862
0.5                  -0.0025717430483357794  -0.0025717430483357794  -0.0025904580222108962  -0.0025717430483357794  -0.0025710930483357794

Но я искал inplace решение (аналогично sed -i).

Конечно, я могу переименовать файл во что-нибудь другое c.

    cat input.dat | column -t > output.dat 
    mv output.dat input.dat

Но я хочу знать, есть ли лучшее решение для этого.

Ответы [ 3 ]

3 голосов
/ 10 марта 2020

вместо редактирования на месте, вы можете следовать этому подходу.

$ column -t file > temp && mv temp file

эта функция будет mimi c при форматировании места

$ fip () { temp=$(mktemp) && column -t "$1" > $temp && mv $temp "$1"; }
$ fip file
2 голосов
/ 10 марта 2020

Формулировка редактирования на месте обычно неправильно понимается. Редактирование на месте подразумевает, что вы не меняете файл на диске. Большинство встроенных решений, предоставляемых различными инструментами, такими как sed -i и awk -i inplace, представляют собой не что иное, как маскированную форму

$ tmpfile="$(mktemp)" && command file > "${tmpfile}" && mv "${tmpfile}" file

, которая создает временный файл / копию, а затем переименуйте его в оригинал. Реализация не обязательно такая, но она будет похожей. Таким образом, вы должны знать, что, в конце концов, есть вероятность, что вы дублируете данные. Это особенно громоздко при работе с большими файлами без достаточного дискового пространства. Вы можете легко проверить это, проверив номер индекса файла до и после операции. Единственное истинное место, сделано с помощью dd.

0 голосов
/ 10 марта 2020

Единственный способ улучшить его - это не использовать бесполезно кошку. Вы можете просто column -t input.dat вместо cat input.dat | column -t, так что вы получите

column -t input.dat > output.dat 
mv output.dat input.dat

Этот командный блок аналогичен тому, что делает sed -i ( см. Этот ответ Жилем ), так что улучшать больше нечего.

Если вы предпочитаете однострочный, точный эквивалент командного блока равен column -t input.dat > output.dat; mv output.dat input.dat. Если вы хотите выполнить вторую команду только в том случае, если первая будет выполнена успешно, то column -t input.dat > output.dat && mv output.dat input.dat, как @karakfa уже предоставило в своем ответе.

...