rs
rsmacOS にも付属する BSD ユーティリティですが、他のプラットフォームのパッケージ マネージャーから利用できます。これは、APL の reshape 関数にちなんで名付けられました。
一連のスペースとタブを列区切りとして使用します。
rs -T
タブを列区切りとして使用する:
rs -c -C -T
列区切りとしてコンマを使用します。
rs -c, -C, -T
-c入力列セパレータを-C変更し、出力列セパレータを変更します。単独の-cor-Cは、セパレーターをタブに設定します。-T行と列を入れ替えます。
-tの代わりに使用しないでください-T。これは、出力行がディスプレイの幅 (デフォルトでは 80 文字ですが、 で変更できます) を満たすように出力列の数を自動的に選択するためです-w。
を使用して出力列セパレータを指定する-Cと、余分な列セパレータ文字が各行の末尾に追加されますが、次のコマンドで削除できますsed。
$ seq 4|paste -d, - -|rs -c, -C, -T
1,3,
2,4,
$ seq 4|paste -d, - -|rs -c, -C, -T|sed s/.\$//
1,3
2,4
これは、最初の行の列数に基づいて列数が決定されるため、最初の行が 1 つ以上の空の列で終わるテーブルでは失敗します。
$ rs -c, -C, -T<<<$'1,\n3,4'
1,3,4,
ガウク
$ seq 4|paste -d, - -|awk '{for(i=1;i<=NF;i++)a[i][NR]=$i}END{for(i in a)for(j in a[i])printf"%s"(j==NR?"\n":FS),a[i][j]}' FS=,
1,3
2,4
これは、gawk拡張機能である配列の配列を使用します。macOS には、nawk配列の配列をサポートしない 2007 以降のバージョンが付属しています。
スペースとタブ文字のシーケンスを折りたたまずにスペースをセパレータとして使用するには、 を使用しますFS='[ ]'。
ルビー
$ seq 4|paste -d, - -|ruby -e'STDIN.map{|x|x.chomp.split(",",-1)}.transpose.each{|x|puts x*","}'
1,3
2,4
最後の空のフィールドの破棄-1を無効にする引数:split
$ ruby -e'p"a,,".split(",")'
["a"]
$ ruby -e'p"a,,".split(",",-1)'
["a", "", ""]
関数形式:
$ tp(){ ruby -e's=ARGV[0];STDIN.map{|x|x.chomp.split(s==" "?/ /:s,-1)}.transpose.each{|x|puts x*s}' -- "${1-$'\t'}";}
$ seq 4|paste -d, - -|tp ,
1,3
2,4
s==" "?/ /:s上記で使用されているのは、split関数の引数が単一のスペースの場合、連続したスペースとタブの実行に基づいて文字列が分割される awk のような特別な動作を有効にするためです。
$ ruby -e'p" a \tb ".split(/ /,-1)'
["", "a", "", "\tb", ""]
$ ruby -e'p" a \tb ".split(" ",-1)'
["a", "b", ""]
jq
tp(){ jq -R .|jq --arg x "${1-$'\t'}" -sr 'map(./$x)|transpose|map(join($x))[]';}
jq -R .各入力行を JSON 文字列リテラルとして出力し、-s( --slurp) は各行を JSON として解析した後に入力行の配列を作成し、-r( ) --raw-outputJSON 文字列リテラルの代わりに文字列の内容を出力します。/演算子は、文字列を分割するためにオーバーロードされています。
R
$ printf %s\\n 1,2 3,4|Rscript -e 'write.table(t(read.table("stdin",sep=",")),"",sep=",",quote=F,col.names=F,row.names=F)'
1,3
2,4
に置き換えるRscriptとR、実行中のコードが STDOUT にエコーされます。STDIN全体を読み取る前に終了するignoring SIGPIPE signalようなコマンドが続いた場合にも、エラーが発生します。head -n1
write.table出力ファイルの引数が空の文字列の場合、STDOUT に出力します。