Linux编写一个txt文件,其中几个变量按列排序

1l5u6lss  于 2022-12-11  发布在  Linux
关注(0)|答案(1)|浏览(156)

我想编写一个txt文档,其中包含由3列A、B和C组成的多行,并以空格分隔
其中A总是相同的名称。B是值的序列,即seq 1 100。C是5个名称的循环,即“a”、“b”、“c”、“d”、“e”,然后从“a”再次开始。
例如:
名称A 1 a
名称A 2 B
名称A 3 c
名称A 4 d
名称A 5 e
名称A 6 a
...
我尝试使用seq命令并将其作为一个变量,但不知道如何将这3个变量合并到一个文档中,或者将3个因子(A B C)作为一个变量。

flseospp

flseospp1#

有几种方法可以实现这一点,我将从一个我认为是最优雅的;

$ colA="nameA"
$ colC=({a..e})
$ for colB in $(seq 100); do
>     echo "$colA $colB ${colC[($colB-1) % ${#colC[@]}]}" >> document.txt
> done

说明;
colC被创建为一个可以通过索引访问的数组。数组的长度可以使用磅号(#)来访问,所有项都可以使用at(@)作为索引来访问。注意,默认情况下seq从1开始,但数组索引从0开始,因此范围应该是0到4。

$ colC=({a..e})
$ echo "All items: ${colC[@]}, length: ${#colC[@]}"
All items: a b c d e, length: 5
$ for index in $(seq 0 4); do
>     echo "index: $index, value: ${colC[$index]}"
> done
index: 0, value: a
index: 1, value: b
index: 2, value: c
index: 3, value: d
index: 4, value: e

通过访问当前循环与数组长度之间的除法余数(模运算符%),则相应的项将被相应地打印出来。示例中的第一行是nameA 1 a,因此当前索引必须增加一(如果从0开始),或者在访问数组项时减1,如上例所示。否则,结果将以nameA 0 a、或nameA 1 b。请将document.txt替换为目标文件名。
另一种方法是人为地增加colB的值,同时指示seq跳过5个项目。这种方法可能更简单,但它要求总行数为5(例如,它不能处理102行),所以我不推荐这样做,只是发布此内容以说明如何操作:

$ colA="nameA"
$ for colB in $(seq 1 5 100); do
>     for colC in {a..e}; do
>         echo "$colA $colB $colC" >> document.txt
>         colB=$((colB+1))
>     done
> done

相关问题