同じ列ヘッダーを共有するファイルの複数の列をマージしたいと思います。ファイルは次のようになり、タブで区切ったり、別の方法で区別したりできます。
AaBbN CcDdEeN FfN AaBbN FfN
1 5 4
3 1 2
2 NA 1
1 3
3 2
NA 4
したがって、フィールドに数字または文字列「NA」があります。結果は次のとおりです。
AaBbN CcDdEeN FfN
1 5 4
3 1 2
2 NA 1
1 3
3 2
NA 4
順序付けされていない列が多いため、ヘッダーヘッダーを毎日手動で指定するのではなく、自動的に読み取る必要があります。空のフィールドもたくさんあります。私はこれを行うために研究して注文してきpaste
ました。私の列が同じファイルにある間に別のファイルで動作することを除いて、join
特にjoin
必要なことをするようです。
そのため、列を別々のファイルに分割してから、ここから派生したコマンドを使用してjoin
接続してみました。awk
awk ' { for( i = 1; i <= NF; i++ ) printf( "%s\n", $(i) ) >i ".txt"; } ' file.txt
これにより別の列が提供されますが、ここで最初の問題が発生します。ヘッダーとデータの間にスペースがあるすべての列は正しく処理されませんでした。代わりに、これらのファイルには列ヘッダーしかありません。
2番目の質問は、join
ファイルを再マージしようとすると、入力がソートされていないためにエラーが発生することです。もちろんこれは不可能です。どんなソートでも私が維持していた関係を破壊します。
だから私は今行き止まった路地に閉じ込められています。ファイルから直接列をマージするより便利な方法はありますか?
編集する:
AdminBeesソリューションはトラブルシューティングに最も近いですが、結果は正しくありません。上記の例にawkスクリプトを適用した結果は次のとおりです。すべての項目がタブで区切られていることを確認しましたsed -i "s/[[:space:]]/ /g"
(タブを挿入するにはCTRL + VとTABを使用してください)。
AaBbN CcDdEeN FfN FfN
1 5 4
3 1 2
2 NA 1
1
3
NA
ベストアンサー1
入力内容がタブ区切りの場合:
awk -F"\t" '
NR == 1 {for (i=1; i<=NF; i++) COL[i] = $i
}
{for (i=1; i<=NF; i++) OUT[NR, COL[i]] = $i
}
END {for (n=1; n<=NR; n++) {split ("", DUP)
for (i=1; i<=NF; i++) if (!DUP[COL[i]]++) printf "%s" FS, OUT[n,COL[i]]
printf RS
}
}
' file
A B C
1 5 4
3 1 2
2 2 1
1 3
3 2
1 4
後で部分索引として使用するために列ヘッダーを保存し、各行の値を行番号とヘッダー部分索引で索引付けされた配列に収集します。このEND
セクションでは、配列を元の順序で印刷し、重複した列ヘッダーを処理します。
より複雑なファイル構造の場合、反復処理が主な作業になる可能性があります。