場合によっては、[入力]タブで区切られたリストがソートされていないことがあります。たとえば、次のようになります。
var1 var2 var3
var_with_long_name_which_ruins_alignment var2 var3
ソートする簡単な方法はありますか?
var1 var2 var3
var_with_long_name_which_ruins_alignment var2 var3
答え1
それから答えは次のようになります。
column -t file_name
これにより、列が次に分割されます。どのタブだけでなく空白も可能です。タブでのみ分割するには、次を使用します。
column -t -s $'\t' -n file_name
-s $'\t'
区切り文字をタブにのみ設定し、空の-n
列(隣接タブ)を保持します。
PS:クレジットは次のとおりです。アレックスしかも。元のヒントは、質問に対するコメントとして彼が提供したが、答えとして投稿されていませんでした。
答え2
手動タップ停止の場合:expand -t 42,48
自動タップ停止の場合は推奨事項に従ってください。アレックス:column -t
(expand
全体的にPOSIXシステム。column
おかげで、多くのLinuxディストリビューションでも利用できるBSDユーティリティです。ユーティリティLinux.)
答え3
これを行うスクリプトは次のとおりです。
ラベルの配置
#!/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
答え4
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 はそれぞれ行番号を追加し、改行を無効にします。