Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用bash脚本将一行中的一些重复模式分割成多行?_Linux_Bash_Sed_Awk_Cut - Fatal编程技术网

Linux 如何使用bash脚本将一行中的一些重复模式分割成多行?

Linux 如何使用bash脚本将一行中的一些重复模式分割成多行?,linux,bash,sed,awk,cut,Linux,Bash,Sed,Awk,Cut,我对bash脚本有一些问题 我有一个字符串,它有一些像这样的重复模式 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 ... 每个字段由tab键分隔 我希望它看起来像这样 1 2 3 4 1 2 3 4 1 2 3 4 … 如何使用诸如cut、sed、awk之类的bash脚本解决这个问题 我试过一些命令,比如cut-f'seq 4,4,40'example.txt 它不起作用 看起来很简单,但对我来说很难…您可以像这样使用sed: s='1 2 3 4 1 2 3 4 1 2

我对bash脚本有一些问题

我有一个字符串,它有一些像这样的重复模式

1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 ...
每个字段由tab键分隔

我希望它看起来像这样

1 2 3 4
1 2 3 4
1 2 3 4
…
如何使用诸如cut、sed、awk之类的bash脚本解决这个问题

我试过一些命令,比如
cut-f'seq 4,4,40'example.txt

它不起作用


看起来很简单,但对我来说很难…

您可以像这样使用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

现场演示:您可以像这样使用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

现场演示:如果您事先知道序列的结束编号,您可以执行以下操作:

LAST_NUMBER=4
sed-e“s/$LAST_NUMBER\t*/&\n/g”
只需用序列中的最后一个数字替换
4

如果您不知道该号码,则必须使用以下方法进行搜索:

#/bin/bash
声明-A已检查的\u编号
最后的号码=
读行时;做

SPLIT_LINE=$(cut-d”“-f1-如果事先知道序列的结束编号,可以执行以下操作:

LAST_NUMBER=4
sed-e“s/$LAST_NUMBER\t*/&\n/g”
只需用序列中的最后一个数字替换
4

如果您不知道该号码,则必须使用以下方法进行搜索:

!/bin/bash
声明-A已检查的\u编号
最后的号码=
边读边做

SPLIT_LINE=$(cut-d”“-f1-这是一个纯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

IFS=$'\t'set--$(这里有一个纯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

IFS=$'\t'set--$(An
awk
version

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
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

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
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

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

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

这可能适合您:

printf "%s\t%s\t%s\t%s\n" $string
或者要将字段分隔为空格:

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

这可能适合您:

printf "%s\t%s\t%s\t%s\n" $string
或者要将字段分隔为空格:

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

是否总是有4个字段被重复或会发生变化?是否总是有4个字段被重复或会发生变化?