在列表中重复N次

时间:2018-02-24 03:20:54

标签: bash

我在这样的文本文件中有一个列表:1 2 3 4 5

我正在尝试重复列表中的每个数字一定次数,这样如果N = 2,那么我的列表将变为1 1 2 2 3 3 4 4 5 5

我一直在尝试使用seq命令,但没有运气。有没有一种有效的方法呢?

5 个答案:

答案 0 :(得分:1)

$ N=3; echo 1 2 3 4 5 | tr ' ' \\n | sed "$(yes p | sed $((N-1))q)" | tr \\n ' '; echo
1 1 1 2 2 2 3 3 3 4 4 4 5 5 5

答案 1 :(得分:0)

N=2; cat yourfile.txt | awk -v n=$N '{for(i=1; i<=NF; i++) for(j=1; j<=n; j++) printf i OFS}'

答案 2 :(得分:0)

awk一样优雅,你不需要它。仅在bash中,可能会出现以下情况:

$ n=2; a=( {1..5} )
$ for i in "${a[@]}"; do eval printf \"\$i%.0s \" {1..$n}; done; echo
1 1 2 2 3 3 4 4 5 5

这可以通过将要重复的元素放在数组中,然后单步执行该数组,使用printf通过计算的序列表达式重复for循环的当前元素。此处需要eval,因为您无法在序列表达式中使用变量。

这不是最漂亮的方式,但它有效并且肯定。更长更安全的方法可能是用另一个for循环替换序列表达式:

$ for i in "${a[@]}"; do for ((j=1; j<=$n; j++)); do printf '%s ' "$i"; done; done; echo

这种方法模仿已经呈现的awk解决方案。

如果您不想使用数组元素,可以通过将IFS上的字符串拆分为位置参数来获得类似的结果。问题中更详细的要求将有助于我们提出建议。

答案 3 :(得分:0)

以下是Bash中的简单解决方案:

#!/bin/bash
n=2
while read -r -n1 char; do  # read one character instead of the whole line
    count=0
    while (( $count < $n )); do
        echo -n $char
        ((count++))
    done
done < myfile.txt

输出:1122334455

答案 4 :(得分:0)

我想做

echo 1 2 3 4 5 | sed -r 's/([^ ]*)/\1 \1/g'

但是,当我不知道多久时,我该怎么办呢?怎么重复n次? 它应该是printf '\\1 %.0s' $(seq $n)之类的东西。

我可以通过伪造命令文件将其嵌入到sed命令中:

echo 1 2 3 4 5 | sed -rf <(echo 's/([^ ]*)/'$(printf '\\1 %.0s' $(seq $n))'/g') | tr -s ' '