rearrange columns using awk or cut command

后端 未结 4 2066
闹比i
闹比i 2020-12-12 01:34

I have large file with 1000 columns. I want to rearrange so that last column should be the 3rd column. FOr this i have used,

cut -f1-2,1000,3- file > out.         


        
相关标签:
4条回答
  • 2020-12-12 01:58

    I THINK what you want is:

    awk 'BEGIN{FS=OFS="\t"} {$3=$NF OFS $3; sub(OFS "[^" OFS "]*$","")}1' file
    

    This might also work for you depending on your awk version:

    awk 'BEGIN{FS=OFS="\t"} {$3=$NF OFS $3; NF--}1' file
    

    Without the part after the semi-colon you'll have trailing tabs in your output.

    0 讨论(0)
  • 2020-12-12 02:04

    try this awk one-liner:

    awk '{$3=$NF OFS $3;$NF=""}7' file
    

    this is moving the last col to the 3rd col. if you have 1000, then it does it with 1000th col.

    EDIT

    if the file is tab-delimited, you could try:

    awk -F'\t' -v OFS="\t" '{$3=$NF OFS $3;$NF=""}7' file
    

    EDIT2

    add an example:

    kent$  seq 20|paste -s -d'\t'                              
    1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20
    
    kent$  seq 20|paste -s -d'\t'|awk -F'\t' -v OFS="\t" '{$3=$NF OFS $3;$NF=""}7'
    1   2   20  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  
    

    EDIT3

    You didn't give any input example. so assume you don't have empty columns in original file. (no continuous multi-tabs):

    kent$  seq 20|paste -s -d'\t'|awk -F'\t'  -v OFS="\t" '{$3=$10 FS $11 FS $3;$10=$11="";gsub(/\t+/,"\t")}7'
    1       2       10      11      3       4       5       6       7       8       9       12      13      14      15      16      17      18      19      20
    

    After all we could print those fields in a loop.

    0 讨论(0)
  • 2020-12-12 02:18

    Since many people are searching for this and even the best awk solution is not really pretty and easy to use I wanted to post my solution (mycut) written in Python:

    #!/usr/bin/env python3
    
    import sys
    from signal import signal, SIGPIPE, SIG_DFL
    signal(SIGPIPE,SIG_DFL)
    
    #example usage: cat file | mycut 3 2 1
    
    columns = [int(x) for x in sys.argv[1:]]
    delimiter = "\t"
    
    for line in sys.stdin:
        parts = line.split(delimiter)
    
        print("\t".join([parts[col] for col in columns]))
    

    I think about adding the other features of cut like changing the delimiter and a feature to use a * to print the remaning columns. But then it will get an own page.

    0 讨论(0)
  • 2020-12-12 02:23

    A shell wrapper function for awk' that uses simpler syntax:

    # Usage: rearrange int_n [int_o int_p ... ] < file
    rearrange () 
    { 
        unset n;
        n="{ print ";
        while [ "$1" ]; do
            n="$n\$$1\" \" ";
            shift;
        done;
        n="$n }";
        awk "$n" | grep '\w'
    }
    

    Examples...

    echo foo bar baz | rearrange 2 3 1
    bar baz foo 
    

    Using bash brace expansion, rearrange first and last 5 items in descending order:

    echo {1..1000}a | tr '\n' ' ' | rearrange {1000..995} {5..1}
    1000a 999a 998a 997a 996a 995a 5a 4a 3a 2a 1a 
    

    Sorted 3-letter shells in /bin:

    ls -lLSr /bin/?sh | rearrange 5 9 
    150792 /bin/csh 
    154072 /bin/ash 
    771552 /bin/zsh 
    1554072 /bin/ksh 
    
    0 讨论(0)
提交回复
热议问题