[英]bash for loops not looping (awk, bash, linux)
這是一個示例數據集(10列,2行):
8 1 4 10 7 9 2 3 6 5 0.001475 10.001 20.25 30.5 40.75 51 61.25 71.5 81.75 92
我想為每個數據集輸出十個文件。 每個文件將包含第二行中的唯一值,文件名將包含第一行中相應列的值。
(例如:一個包含.001475的文件,稱為foo_bar_8.1D
請參閱下面的代碼,該代碼旨在用於以下數據集:
OrderTimesKC_voxel_tuning_1.txt OrderTimesKC_voxel_tuning_2.txt OrderTimesKC_voxel_tuning_3.txt OrderTimesKC_voxel_tuning_4.txt OrderTimesKC_voxel_tuning_5.txt
腳本:
subj='KC'
for j in {1..5}; do
for x in {1..10}; do
a=$(awk 'FNR == 1 {print $"$x"}' OrderTimes"$subj"_voxel_tuning_"$j".txt) #a == row 1, column x
b=$(awk 'FNR == 2 {print $"$x"}' OrderTimes"$subj"_voxel_tuning_"$j".txt) #b == row 2, column x
echo $b > voxTim_"$subj"_"$j"_"$a".1D
done
done
當前輸出的文件是:
voxTim_KC_1_8?1?4?10?7?9?2?3?6?5.1D voxTim_KC_2_8?1?4?10?7?9?2?3?6?5.1D voxTim_KC_3_8?1?4?10?7?9?2?3?6?5.1D voxTim_KC_4_8?1?4?10?7?9?2?3?6?5.1D voxTim_KC_5_8?1?4?10?7?9?2?3?6?5.1D
每個文件包含十個值,表明該文件未正確循環。
我想要的是:
voxTim_KC_1_1.1D, voxTim_KC_1_2.1D, voxTim_KC_1_3.1D..... voxTim_KC_2_1.1D, voxTim_KC_2_2.1D, voxTim_KC_2_3.1D..... and so on..
謝謝!
awk
解救!
您可以更有效地使用awk
,例如,此腳本將從每個輸入文件中提取兩個值,並使用數據創建10個(或實際列數)文件
$ awk 'FNR==1{c++; n=split($0,r1); next}
FNR==2{split($0,r2);
for(i=1;i<=n;i++) print r2[i] > "file."c"."r1[i]".1D"}' input1 input2
將為給定的input1和input2文件創建文件集。 您可以將其用作模板並擺脫for循環。
例如
$ tail -n 2 *
==> input1 <==
8 1 4 10 7 9 2 3 6 5
0.001475 10.001 20.25 30.5 40.75 51 61.25 71.5 81.75 92
==> input2 <==
98 91 94 910 97 99 92 93 96 95
0.001475 10.001 20.25 30.5 40.75 51 61.25 71.5 81.75 92
運行腳本后
$ ls
file.1.1.1D file.1.2.1D file.1.4.1D file.1.6.1D file.1.8.1D file.2.91.1D file.2.92.1D file.2.94.1D file.2.96.1D file.2.98.1D input1
file.1.10.1D file.1.3.1D file.1.5.1D file.1.7.1D file.1.9.1D file.2.910.1D file.2.93.1D file.2.95.1D file.2.97.1D file.2.99.1D input2
和內容
$ tail -n 2 file.1*
==> file.1.1.1D <==
10.001
==> file.1.10.1D <==
30.5
==> file.1.2.1D <==
61.25
==> file.1.3.1D <==
71.5
==> file.1.4.1D <==
20.25
etc...
實際上,您可以將其進一步簡化為
$ awk 'FNR==1{c++; n=split($0,r1)}
FNR==2{for(i=1;i<=n;i++) print $i > ("file."c"."r1[i]".1D")}' input1 input2
只用bash:
subj=KC
for j in {1..5}; do
{
read -ra a # read the 1st line into array 'a'
read -ra b # read the 2nd line into array 'b'
for i in {0..9}; do
echo "${b[i]}" > "voxTim_${subj}_${j}_${a[i]}.1D"
done
} < "OrderTimes${subj}_voxel_tuning_${j}.txt"
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.