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

一个awk版本

awk  '{for (i=1;i<=NF;i++) {printf "%s"(i%4?" ":"\n"),$i}}' file
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

一个gnu awk版本

awk -v RS="\t" '{printf "%s"(NR%4?" ":"\n"),$0}' file
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
于 2013-10-13T05:35:32.593 回答
1

这是一个纯粹的 bash 解决方案:

IFS=$'\t' set -- $(<input_file)
seen=()
while [[ $1 ]]; do
  if (( ${seen[$1]} )); then # If we've seen the value before, start a new line.
    echo
    unset seen
  fi
  printf '%s ' "$1"
  seen[$1]=1
  shift
done
于 2013-10-13T04:38:25.783 回答
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 回答
1

xargs可能有帮助:

kent$  echo "1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4"|xargs -n4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
于 2013-10-13T10:29:20.293 回答
1

这可能对您有用:

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

或者您希望字段空间分开:

printf "%s %s %s %s\n" $string
于 2013-10-13T10:38:06.387 回答