我在这样的文本文件中有一个列表:1 2 3 4 5
我正在尝试重复列表中的每个数字一定次数,这样如果N = 2,那么我的列表将变为1 1 2 2 3 3 4 4 5 5
我一直在尝试使用seq命令,但没有运气。有没有一种有效的方法呢?
答案 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 ' '