私はインターンシップをより簡単にするために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回繰り返します。
問題は、実際には4つの数字で構成される2セットではなく、それぞれ34個の数字で構成された7セットがあるため、合計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を使用することはできません。これは現在私のエラーですが、より多くのエラーがあると思います。私は別のアプローチで開いています。
- 2つの行番号を入力として使用して単一の行に沿って列にソートする自動方法はありますか?
- この行を別の列で開始する自動方法はありますか?グループ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