Bash 嵌套循环

Bash 嵌套循环

我需要以下格式的输出:

例如,考虑我的输入文件中从 1 到 50 的数字序列,每个数字代表一行数据:

$ cat input.txt
1
2
3
.
.
.
49
50

我希望它们位于 5 个文件中,每个文件有 10 行:

$ cat output1.txt
1
2
.
.
.
9
10

$ cat output2.txt
11
12
.
.
.
19
20 

等等。我想通过 Bash 脚本来执行此操作,而不使用命令split

答案1

一种awk方法:

awk -va=1 '{ print > a; if(NR % 10 ==0){a++} }' input 

这将生成文件12345要使其打印到output15,请改用:

awk -va=1 '{ print > "output"a; if(NR % 10 ==0){a++} }' input 

解释

  • -va=1:将变量设置a1
  • print > "output"a;:打印当前行到一个名为的文件output以及变量的当前值a
  • if(NR % 10 ==0){a++}:NR是当前行号。因此,如果NR是 的倍数10(如果NR模 10 为 0),则将变量的值加a一。这可确保输出文件的编号根据需要进行更改。

答案2

显然你可以用split(https://stackoverflow.com/questions/2016894/how-to-split-a-large-text-file-into-smaller-files-with-equal-number-of-lines)但如果​​你想用循环来代替:

numLines=$(cat input.txt | wc -l)
size=50
n=$(( numLines / size ))

for (( i=0; i<n; i++ )); do
     j=$(( i*size + 1 ))
     tail -n +$j input.txt | head -n $size > output_$i.txt
done

单行格式:

numLines=$(cat input.txt | wc -l); for (( i=0; i<$(( numLines / 50 )); i++ )); \
    do tail -n +$(( i*50 + 1)) input.txt | head -n 50 > output_$i.txt; done

相关内容