特定の数のスペースで区切られた入力からテキストをラップする方法をバッシュします。

特定の数のスペースで区切られた入力からテキストをラップする方法をバッシュします。

「1 2 6 9 18 19 25 67 89 102 140 187」のような長い文字列があり、数字の代わりに指定された数の入力または空白(たとえば、3番目の入力から折りたたみ)の後に折りたたみたいです。それ、いろいろ。

答え1

最も簡単な答えはおそらく次のとおりです。

echo "1 2 6 9 18 19 25 67 89 102 140 187 99 12" | xargs -n 3

答え2

これは、単語(スペースで区切られた文字列など)から標準入力を縮小するPerlスクリプトです。コマンドラインで「単語数」を指定できます。

たとえば、fold-words.plとして保存して実行可能にします。chmod +x fold-words.pl

#! /usr/bin/perl 

use strict;

my $max = shift ;

while (<>) { 
    my $count = 0;
    foreach my $word (split) {
        print "$word " ;
        $count++ ;
        print "\n" if ($count % $max == 0)
    }
    print "\n" if ($count % $max != 0);
    $count=0;
}

出力例:

$ echo "1 2 6 9 18 19 25 67 89 102 140 187 99 12"  | ./fold-words.pl 3
1 2 6 
9 18 19 
25 67 89 
102 140 187 
99 12 

(split)任意の正規表現を使用するように変更すると、「単語」のより厳密な(さらに奇妙な)定義を持つことができます。たとえば、(split /\t/)デフォルトの「1つ以上の空白文字」ではなく、単一のタブでのみ分割されます。

答え3

これは単純なawkバージョンです。%31行あたりのフィールド数を変えるには、3を変更してください。

awk '{ for(i=1; i<NF; i++) { printf $i OFS; if (i%3 == 0) { print "" }} printf $i}'

実行例:

$ str="one two three four five"
$ echo $str | awk '{ for(i=1; i<NF; i++) { printf $i OFS; if (i%3 == 0) { print "" }} printf $i}'
one two three
four five

関連情報