次のようにタブ区切りのファイルがあるとしますdata.tsv
。
1 a 3
2 b 2
3 a 10
2 c 2
2 a 8
次のコマンドを使用して、列1の値をIDから名前に変換したいと思いますmap.tsv
。
1 foo
2 bar
3 baz
結果は次のとおりです。
foo a 3
bar b 2
baz a 10
bar c 2
bar a 8
私は知っている一ついくつかのAWKトリックを使用してマッピングを実行することは可能ですが、複数の列に複数のマッピングを使用し、次のように簡単な呼び出しを行うことができることを願っています。
$ my_map_command 1:map.tsv < data.tsv
同様の操作を実行するコマンドはありますか?
ベストアンサー1
csvkit
csvjoin
パッケージのコマンドcsvkit同様の動作を達成するために使用できます。
$ csvjoin -tH -c 1,1 data.tsv map.tsv 2> /dev/null
a,b,c,b2
1,a,3,foo
2,b,2,bar
3,a,10,baz
2,c,2,bar
2,a,8,bar
csvcut
列の並べ替えと削除は簡単で、同じパッケージで実行できます。
コアツール
この基準を使用することもできjoin(1)
ますが、データを並べ替える必要があります(ソートされていない場合は地図も含めて)。
$ join -j1 -t ' ' <(sort -k1 data.tsv) map.tsv
1 a 3 foo
2 a 8 bar
2 b 2 bar
2 c 2 bar
3 a 10 baz
どちらの場合も、一度に1つのマッピングしか実行できないため、追加の呼び出しのために複数のマッピングをパイプで接続する必要があります。