rs
rs
macOS にも付属する BSD ユーティリティですが、他のプラットフォームのパッケージ マネージャーから利用できます。これは、APL の reshape 関数にちなんで名付けられました。
一連のスペースとタブを列区切りとして使用します。
rs -T
タブを列区切りとして使用する:
rs -c -C -T
列区切りとしてコンマを使用します。
rs -c, -C, -T
-c
入力列セパレータを-C
変更し、出力列セパレータを変更します。単独の-c
or-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-output
JSON 文字列リテラルの代わりに文字列の内容を出力します。/
演算子は、文字列を分割するためにオーバーロードされています。
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 に出力します。