Save modifications in place with awk

前端 未结 8 1963
轻奢々
轻奢々 2020-11-21 23:32

I am learning awk and I would like to know if there is an option to write changes to file, similar to sed where I would use -i option

相关标签:
8条回答
  • 2020-11-21 23:48

    @sudo_O has the right answer.

    This can't work:

    someprocess < file > file
    

    The shell performs the redirections before handing control over to someprocess (redirections). The > redirection will truncate the file to zero size (redirecting output). Therefore, by the time someprocess gets launched and wants to read from the file, there is no data for it to read.

    0 讨论(0)
  • 2020-11-21 23:53

    In GNU Awk 4.1.0 (released 2013) and later, it has the option of "inplace" file editing:

    [...] The "inplace" extension, built using the new facility, can be used to simulate the GNU "sed -i" feature. [...]

    Example usage:

    $ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3
    

    To keep the backup:

    $ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
    > { print }' file1 file2 file3
    
    0 讨论(0)
  • 2020-11-21 23:53

    Using tee

     awk '{awk code}' file | tee file
    

    the tee command take place and executed after the awk command is finished due to the |.

    0 讨论(0)
  • 2020-11-21 23:57

    In case you want an awk-only solution without creating a temporary file and usable with version!=(gawk 4.1.0):

    awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file
    
    0 讨论(0)
  • 2020-11-21 23:58

    Unless you have GNU awk 4.1.0 or later...

    You won't have such an option as sed's -i option so instead do:

    $ awk '{print $0}' file > tmp && mv tmp file
    

    Note: the -i is not magic, it is also creating a temporary file sed just handles it for you.


    As of GNU awk 4.1.0...

    GNU awk added this functionality in version 4.1.0 (released 10/05/2013). It is not as straight forwards as just giving the -i option as described in the released notes:

    The new -i option (from xgawk) is used for loading awk library files. This differs from -f in that the first non-option argument is treated as a script.

    You need to use the bundled inplace.awk include file to invoke the extension properly like so:

    $ cat file
    123 abc
    456 def
    789 hij
    
    $ gawk -i inplace '{print $1}' file
    
    $ cat file
    123
    456
    789
    

    The variable INPLACE_SUFFIX can be used to specify the extension for a backup file:

    $ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file
    
    $ cat file
    123
    456
    789
    
    $ cat file.bak
    123 abc
    456 def
    789 hij
    

    I am happy this feature has been added but to me, the implementation isn't very awkish as the power comes from the conciseness of the language and -i inplace is 8 characters too long i.m.o.

    Here is a link to the manual for the official word.

    0 讨论(0)
  • 2020-11-21 23:58

    just a little hack that works

    echo "$(awk '{awk code}' file)" > file
    
    0 讨论(0)
提交回复
热议问题