0

以下のようなファイルがあります。

name1   name2   name3   name4    
AA  BB  BB  CC   
AA  AA  BB  CC   
AA  CC  BB  CC   
AA  DD  BB  DD   
AA  DD  BB  AA   

列 1 と列 3 には、同じ文字列が含まれています。ケースが上記の場合、列全体を削除したいが、ヘッダーは保持します。最終的にはこのようなファイルになります。

name2   name4   
BB  CC         
AA  CC   
CC  CC   
DD  DD   
DD  AA   

grep または awk を使用してこれを行う方法はありますか? どうもありがとう!

4

3 に答える 3

1

これはパフォーマンスの点で完全に最適ではありませんがawk、サンプル入力に対して使用し、機能します。

file=$1

header=$(head -1 "$file")
i=1
goodcols=""
for colname in $header; do
  count=$(awk "NR>1 {print \$$i}" "$file" | sort -u | wc -l)
  if [ $count -gt 1 ]; then
    if [ -z "$goodcols" ]; then
      goodcols="\$$i"
    else
      goodcols="$goodcols, \$$i"
    fi
  fi
  i=$((i+1))
done

awk "{print $goodcols}" "$file"
于 2015-01-22T03:35:16.920 に答える
0

UNIX シェルは、単に UNIX ツールを呼び出すための環境です。一般的なテキスト操作用の UNIX ツールは awk なので、そのまま使用してください。

$ cat tst.awk
{
    for (col=1; col<=NF; col++) {
        val[NR,col] = $col
        if ( (NR>1) && (!seen[col,$col]++) ) {
            cnt[col]++
        }
    }
}
END {
    for (row=1; row<=NR; row++) {
        ofs = ""
        for (col=1; col<=NF; col++) {
            if (cnt[col] != 1) {
                printf "%s%s", ofs, val[row,col]
                ofs = OFS
            }
        }
        print ""
    }
}

$ awk -f tst.awk file
name2 name4
BB CC
AA CC
CC CC
DD DD
DD AA
于 2015-01-22T04:02:49.307 に答える