Awk: extract different columns from many different files

前端 未结 3 1326
北恋
北恋 2020-12-09 06:40

File Example

I have a 3-10 amount of files with:

 - different number of columns
 - same number of rows
 - inconsistent spacing (sometimes o         


        
相关标签:
3条回答
  • 2020-12-09 07:29

    Assuming each of your files has the same number of rows, here's one way using GNU awk. Run like:

    awk -f script.awk file1.txt file2.txt file3.txt file4.txt
    

    Contents of script.awk:

    FILENAME == ARGV[1] { one[FNR]=$1 }
    FILENAME == ARGV[2] { two[FNR]=$3 }
    FILENAME == ARGV[3] { three[FNR]=$7 }
    FILENAME == ARGV[4] { four[FNR]=$1 }
    
    END {
        for (i=1; i<=length(one); i++) {
            print one[i], two[i], three[i], four[i]
        }
    }
    

    Note:

    By default, awk separates columns on whitespace. This includes tab characters and spaces, and any amount of these. This makes awk ideal for files with inconsistent spacing. You can also expand the above code to include more files if you wish.

    0 讨论(0)
  • 2020-12-09 07:38

    The combination of cut and paste should work:

    $ cat f1
    foo
    bar
    baz
    $ cat f2
    1 2 3
    4 5 6
    7 8 9
    $ cat f3
    a b c d
    e f g h
    i j k l
    $ paste -d' ' <(cut -f1 f1) <(cut -d' ' -f2 f2) <(cut -d' ' -f3 f3)
    foo 2 c
    bar 5 g
    baz 8 k
    

    Edit: This works with tabs, too:

    $ cat f4
    a       b       c       d
    e       f       g       h
    i       j       k       l
    $ paste -d' ' <(cut -f1 f1) <(cut -d' ' -f2 f2) <(cut -f3 f4)   
    foo 2 c
    bar 5 g
    baz 8 k
    
    0 讨论(0)
  • 2020-12-09 07:41

    In your paste / cut attempt, replace cut by awk:

    $ paste <(awk '{print $1}' file1 ) <(awk '{print $3}' file2 ) <(awk '{print $7}' file3) <(awk '{print $1}' file4)
    
    0 讨论(0)
提交回复
热议问题