6

awkで解決したい次の問題があります。100,000 行と 5,000 列で構成される、カンマ区切りの大きなテキスト テーブルが 1 つあります。最初の行はヘッダーで、最初の列はレコード ID です。次に、最初のファイルのヘッダーのサブセットを含む 2 番目のテキスト ファイルを作成します。2 番目のファイルで指定されたリストにヘッダーが含まれている最初のファイルのすべての列を抽出したいと考えています。入力と目的の出力の例を次に示します。

DATA.TXT

   ID, head1, head2, head3, head4  
    1, 25.5, 1364.0, 22.5, 13.2  
    2, 10.1, 215.56, 1.15, 22.2  

リスト.TXT

head1  
head4  

望ましい出力:

ID, head1, head4  
1, 25.5, 13.2  
2, 10.1, 22.2

この問題をawkで解決する方法、またはUNIXスクリプトを使用して解決する方法について、誰かアドバイスをいただけますか? 助けてくれてありがとう!

4

2 に答える 2

4

csv ファイルから特定の列名を抽出するために使用できる便利なawkスクリプトがここにあります。

別のファイルから列名を読み取れるように、少し変更しました。以下のスクリプトを として保存しますdataExtractor.sh

#!/bin/bash

DATAFILE=${1:-data.txt}
COLUMNFILE=${2:-list.txt}

awk -F, -v colsFile="$COLUMNFILE" '
   BEGIN {
     j=1
     while ((getline < colsFile) > 0) {
        col[j++] = $1
     }
     n=j-1;
     close(colsFile)
     for (i=1; i<=n; i++) s[col[i]]=i
   }
   NR==1 {
     for (f=1; f<=NF; f++)
       if ($f in s) c[s[$f]]=f
     next
   }
   { sep=""
     for (f=1; f<=n; f++) {
       printf("%c%s",sep,$c[f])
       sep=FS
     }
     print ""
   }
' "$DATAFILE"

それを実行する:

$ cat data.txt
ID,head1,head2,head3,head4
1,25.5,1364.0,22.5,13.2
2,10.1,215.56,1.15,22.2

$ cat list.txt
ID
head1
head4

$ dataExtractor.sh data.txt list.txt
1,25.5,13.2
2,10.1,22.2
于 2012-06-19T10:22:22.793 に答える
4

私には考えがありますが、私はシェルプログラミングの経験がない (そして awk を知らない) ので、これはばかげた方法でいくつかの車輪を再発明するように見えます:

$ cat DATA.TXT 
ID, head1, head2, head3, head4
1, 25.5, 1364.0, 22.5, 13.2
2, 10.1, 215.56, 1.15, 22.2

$ cat LIST.TXT 
head1
head4

$ cols=($(sed '1!d;s/, /\n/g' DATA.TXT | grep -nf LIST.TXT | sed 's/:.*$//'))

$ cut -d ',' -f 1$(printf ",%s" "${cols[@]}") DATA.TXT 
ID, head1, head4
1, 25.5, 13.2
2, 10.1, 22.2

PS私は、これこの回答から、bash配列に関するいくつかの非常に基本的なアイデアを使用しました。

于 2012-06-19T10:23:50.590 に答える