5

ファイル例

I have a 3-10 amount of files with:

 - different number of columns
 - same number of rows
 - inconsistent spacing (sometimes one space, other tabs, sometimes many spaces) **within** the very files like the below


>      0    55.4      9.556E+09   33
>      1     1.3      5.345E+03    1
>        ........
>     33   134.4      5.345E+04  932
>
       ........

file1 から列 (たとえば) 1、file2 から列 3、file3 から列 7、file4 から列 1 を取得し、それらを 1 つのファイルに並べて結合する必要があります。

試行 1:機能しない

paste <(cut -d[see below] -f1 file1) <(cut -d[see below] -f3 file2) [...]

区切り文字が ' ' または空でした。

試行 2: 2 つのファイルを操作するが、多くのファイルを操作するわけではない

awk '{
     a1=$1;b1=$4;
     getline <"D2/file1.txt";
     print a1,$1,b1,$4
}' D1/file1.txt >D3/file1.txt

より一般的な質問:

多くの異なるファイルから異なる列を抽出するにはどうすればよいですか?

4

3 に答える 3

20

paste/試行で、次cutのように置き換えます。cutawk

$ paste <(awk '{print $1}' file1 ) <(awk '{print $3}' file2 ) <(awk '{print $7}' file3) <(awk '{print $1}' file4)
于 2012-10-05T14:13:08.480 に答える
8

各ファイルの行数が同じであると仮定して、を使用する1つの方法を次に示しますGNU awk。次のように実行します:

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

内容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]
    }
}

ノート:

デフォルトでは、awk空白で列を区切ります。これには、タブ文字とスペース、およびこれらの任意の量が含まれます。これによりawk、間隔が一定していないファイルに最適です。必要に応じて、上記のコードを拡張して、さらに多くのファイルを含めることもできます。

于 2012-10-05T13:57:03.710 に答える
1

cutとの組み合わせがpaste機能するはずです。

$ 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

編集:これはタブでも機能します:

$ 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
于 2012-10-05T12:17:39.813 に答える