Solarisにリストを含むファイルがあります。
List A
hi
hello
hw r u
List B
Hi
Yes
List C
Hello
以下に示すようにリストを転置する必要があります。
List A List B List C
hi Hi Hello
hello Yes
hw r u
Solarisでこれを行うにはどうすればよいですか?
awk
を使用して各ブロックを個別のファイルに分割し、次にそれらをpaste
することができます(以下では、各リストの間に常に空の行があると想定しています)。
awk '/^$/ {N++;next}{print >"file"N}' infile.txt
paste file*
また、paste
コマンドをawk
に移動することもできます。
awk '/^$/ {N++;next}{print >"file"N} END{system("paste file*")}' inile.txt
出力は次のとおりです。
List A List B List C
hi Hi Hello
hello Yes
hw r u
以下のように線の長さを変えると、結果として美しさのくぼみができます。
list A
hi
hello
hw r u
List B
Hi this is list B
Yes
List C
Hello, this is list C
あなたができること paste file* |column -s $'\t' -tn
そして結果が出ます:
list A List B List C
hi Hi this is list B Hello, this is list C
hello Yes
hw r u
私の前の答えのほかに 、同じ方法でファイルを分割するcsplit
コマンドもあり、次にpaste
コマンドを使用して目的の出力を取得します。
csplit -zs -f outputfile inputfile '/^List/' '{*}'
paste outfile*
'/^List/'
は、そこにあるファイルを一致させて次の新しいファイルに分割するパターンです。'{*}'
パターンをできるだけ繰り返します-z
は、空の出力ファイルを削除するために使用されます。 -s
は、出力ファイルサイズのカウントを出力しないために使用されます-f
は、カスタムプレフィックスoutputfile ##を定義するために使用されます。ここで、##
はデフォルトで2桁ですが、-n N
(Nはサフィックスの桁数)で定義できます。定義されたプレフィックスの後)コマンド
for i in "List A" "List B" "List C"; do sed -n "/$i/,/^$/p" h.txt >"$i.txt"; done
paste List\ *
出力
List A List B List C
hi Hi Hello
hello Yes
hw r u