我刚刚开始使用 bash 是为了让实习的跑腿工作变得更容易。因此,如果我最初的尝试如此偏离目标而没有帮助,我提前表示歉意。请随时要求澄清。
我的输入类似于:
Set1
1
2
3
4
Set2
5
6
7
8
我希望我的输出是:
group1 1 5
group1 2 6
group2 3 7
group2 4 8
所以我可以做
A=$(sed -n '2p' input)
B=$(sed -n '7p' input)
printf "group1\t$A\t$B" >> output
并重复此操作 3 次。
问题是,我实际上有 7 组,每组 34 个数字,而不是 2 组,每组 4 个数字,所以总共大约 200-300 个。这就是为什么我想制作一个脚本来自动执行此任务。
对于前 17 个数字(第 1 组),我有:
#!/bin/bash
##############################################################################
#group1
for (( i=0; i<=16; i++ )) ;
do
A=$(echo "scale=1;x=2+$i; x" |bc -l)
B=$(echo "scale=1;x=128+$i; x" |bc -l)
C=$(sed -n "$Ap" input)
D=$(sed -n "$Bp" input)
printf "group1\t$C\t$D\n" >> output
done
当然,它根本不起作用,可能有很多原因。一方面,我实际上无法使用 sed 使用变量作为行号的输入来过滤特定行。这是我当前的错误,但我怀疑还会有更多错误。我对其他方法持开放态度。
- 是否有一种自动方法将两个行号作为输入并将它们沿单行排列在列中?
- 是否有一种自动方法可以使这一行以另一列开始,例如。组1/组1/组2/组2?
感谢您的任何建议。
答案1
如果您想要一些快速而肮脏的方法来对数据进行列化,您可以尝试pr
pr -t -2 input
Set1 Set2
1 5
2 6
3 7
4 8
pr -t -7 input17x7
Set1 Set2 Set1 Set2 Set1 Set2 Set1
1 a 1 a 1 a 1
2 b 2 b 2 b 2
3 c 3 c 3 c 3
4 d 4 d 4 d 4
5 e 5 e 5 e 5
6 f 6 f 6 f 6
7 g 7 g 7 g 7
8 h 8 h 8 h 8
9 i 9 i 9 i 9
10 j 10 j 10 j 10
11 k 11 k 11 k 11
12 l 12 l 12 l 12
13 m 13 m 13 m 13
14 n 14 n 14 n 14
15 o 15 o 15 o 15
16 p 16 p 16 p 16
17 q 17 q 17 q 17
为了更好地控制,有rs
实用程序。例如,您可以这样做:
{ printf 'Group\n' ; printf 'group%d\n' {1..17} ; cat input17x7; } | rs -et 18 8
Group Set1 Set2 Set1 Set2 Set1 Set2 Set1
group1 1 a 1 a 1 a 1
group2 2 b 2 b 2 b 2
group3 3 c 3 c 3 c 3
group4 4 d 4 d 4 d 4
group5 5 e 5 e 5 e 5
group6 6 f 6 f 6 f 6
group7 7 g 7 g 7 g 7
group8 8 h 8 h 8 h 8
group9 9 i 9 i 9 i 9
group10 10 j 10 j 10 j 10
group11 11 k 11 k 11 k 11
group12 12 l 12 l 12 l 12
group13 13 m 13 m 13 m 13
group14 14 n 14 n 14 n 14
group15 15 o 15 o 15 o 15
group16 16 p 16 p 16 p 16
group17 17 q 17 q 17 q 17
如果您不需要标头,请通过管道传输结果tail -n +2