簡體   English   中英

bash循環不循環(awk,bash,linux)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM