0

bash スクリプトに問題があります。

このようなパターンが繰り返される文字列があります。

1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 ...

各フィールドはタブキーで区切られています。

こんな感じにしたい…

1 2 3 4
1 2 3 4
1 2 3 4
…

cut、sed、awk ...などのbashスクリプトを使用してこの問題を解決するにはどうすればよいですか?

私はいくつかのコマンドを試しましたcut -f 'seq 4, 4, 40' example.txt

うまくいかない...

とても簡単に見えますが、私にはとても難しいです...

4

6 に答える 6

1

これはあなたのために働くかもしれません:

printf "%s\t%s\t%s\t%s\n" $string

または、フィールドのスペースを区切ってください:

printf "%s %s %s %s\n" $string
于 2013-10-13T10:38:06.387 に答える
1

次のように sed を使用できます。

s='1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4'
p='1 2 3 4'
echo "$s"|sed "s/$p\s*/&\n/g"
1 2 3 4 
1 2 3 4 
1 2 3 4 
1 2 3 4

ライブデモ: http://ideone.com/P59OCJ

于 2013-10-13T04:29:43.060 に答える
1

シーケンスの終了番号が事前にわかっている場合は、次のようなことができます。

LAST_NUMBER=4
sed -e "s/$LAST_NUMBER\t*/&\n/g" < example.txt

4シーケンスの最後の番号に置き換えるだけです

番号がわからない場合は、次の方法で検索する必要があります。

#!/bin/bash

declare -A CHECKED_NUMBERS
LAST_NUMBER=

while read LINE; do
    SPLIT_LINE=$(cut -d" " -f1- <<< "$LINE")

    for number in $SPLIT_LINE; do 
        if [ "${CHECKED_NUMBERS[$number]}" == "1" ]; then
            LAST_NUMBER=$number
        else
            CHECKED_NUMBERS[$number]=1
        fi
    done
done < example.txt

# do the replacement 
sed -e "s/$LAST_NUMBER\t*/&\n/g" < example.txt
于 2013-10-13T04:30:45.787 に答える