時々、私は入力タブで区切られたリストとして取得しています。
var1 var2 var3
var_with_long_name_which_ruins_alignment var2 var3
それらを整列させる簡単な方法はありますか?
var1 var2 var3
var_with_long_name_which_ruins_alignment var2 var3
したがって、答えは次のようになります。
column -t file_name
これは、タブだけではなく、any空白で列を分割することに注意してください。タブのみで分割したい場合は、次を使用します。
column -t -s $'\t' -n file_name
-s $'\t'
は区切り文字をタブのみに設定し、-n
空の列(隣接するタブ)を保持します。
PS:クレジットが Alex にも適用されることを指摘したいだけです。元のヒントは質問へのコメントとして彼から提供されましたが、回答として投稿されることはありませんでした。
これを行うスクリプトは次のとおりです。
aligntabs.pl
#!/usr/bin/Perl
my $delim = '\s*\t\s*';
my %length = ();
my @lines = ();
for my $line (<>) {
chomp $line;
my @words = split $delim, $line;
my $numwords = scalar(@words);
for my $i (0..$numwords-1) {
my $maxlen = $length{$i} // 0;
my $thislen = length($words[$i]);
$maxlen = ($thislen > $maxlen)? $thislen: $maxlen;
$length{$i} = $maxlen;
}
Push @lines, [@words];
}
foreach my $wordsref (@lines) {
my @words = @$wordsref;
my $numwords = scalar(@words);
for my $i (0..$numwords-1) {
if ($i < $numwords-1) {
my $fieldlen = $length{$i};
printf "%-${fieldlen}s ", $words[$i];
}
else {
print $words[$i];
}
}
print "\n";
}
使用量
$ aligntabs.pl < infile
var1 var2 var3
var_with_long_name_which_ruins_alignment var2 var3
手動タブストップの場合:expand -t 42,48
alex で推奨される自動タブストップの場合:column -t
(expand
はすべてのPOSIXシステムにあります。column
はBSDユーティリティであり、多くのLinuxディストリビューションでも利用できます。)
私が揃えたいと思ったPeter.Oのコメント(タブ区切りデータ、TSV)に続いて、このフレーズは非常にうまく機能します。
column -t -s $'\t' /Users/me/data.csv | less --chop-long-lines
Miller( http://johnkerl.org/miller/doc )を使用すると、きれいな印刷出力が得られます。
走る
mlr --inidx --ifs "\t" --opprint cat input | tail -n +2
持つため
var1 var2 var3
var_with_long_name_which_ruins_alignment var2 var3
sed 's/||/| |/g;s/||/| |/g' filename-here | column -s"|" -t | less -#2 -N -S
説明:
Sedは空白の区切り文字の間にスペースを追加します
列は列の間に等間隔を追加します
zydsld|asl|asd
das|aosdk|dd
なる
zydsld|asl |asd
das |aosdk|dd
Lessはファイルビューアで出力を開きます。 -Nと-Sはそれぞれ行番号を追加し、折り返しを無効にします