bash for循环不循环(awk、bash、linux)
下面是一个示例数据集(10列,2行): 当前输出的文件包括: 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_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 每个文件包含10个值,表示循环不正确 我想要的是: 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.. 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。。。。。 等等bash for循环不循环(awk、bash、linux),linux,bash,awk,Linux,Bash,Awk,下面是一个示例数据集(10列,2行): 当前输出的文件包括: 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_8?1?4?10?7?9?2?3?6?5.1D vox
谢谢大家!
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
和内容
$ 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...
$tail-n2文件。1*
==>file.1.1.1D file.1.10.1D file.1.2.1D file.1.3.1D file.1.4.1Dawk
救命
您可以更有效地使用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
和内容
$ 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...
$tail-n2文件。1*
==>file.1.1.1D file.1.10.1D file.1.2.1D file.1.3.1D file.1.4.1D仅使用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
subc=KC
对于j in{1..5};做
{
read-ra a#将第一行读入数组“a”
read-ra b#将第2行读入数组“b”
因为{0..9}中的i;do
echo“${b[i]}>“voxTim{subj}{j}{a[i]}.1D”
完成
}<“OrderTimes${subj}\u体素\u调谐${j}.txt”
完成
仅使用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
subc=KC
对于j in{1..5};做
{
read-ra a#将第一行读入数组“a”
read-ra b#将第2行读入数组“b”
因为{0..9}中的i;do
echo“${b[i]}>“voxTim{subj}{j}{a[i]}.1D”
完成
}<“OrderTimes${subj}\u体素\u调谐${j}.txt”
完成
您的循环没有按照您的想法进行,因为您混淆了awk和shell,并且误解了shell引用规则,但更重要的是,无论您尝试做什么,您的方法都是错误的,请解释您尝试做什么,以及一些具体的、可测试的示例输入和预期的输出,我们可以帮助您。如果/当您得到一个答案,告诉您如何使您现有的脚本生成您期望的输出时,请记住这是错误的方法。您的循环没有按照您的想法进行,因为您混淆了awk和shell,并且误解了shell引用规则,但更重要的是,无论您尝试做什么,您的方法是错误的。请解释您试图做什么,以及一些具体的、可测试的示例输入和预期输出,我们可以帮助您。如果/当您得到一个答案,告诉您如何使现有脚本生成您期望的输出时,请记住这是错误的方法。echo
在这里可能没问题,但是echo“$…”
在某些情况下可能会做错误的事情printf“%s\n'”$…“
始终是安全的。如果x=-n
则echo“$x”
只打印printf“%s\n'”$x“
prints'-n”。同样的情况也发生在-e
和-e
上。此外,如果设置了xpg\u echo
,则echo
参数中的反斜杠转义序列将被展开。echo
在这里可能是正常的,但是echo“$…”
在某些情况下可能会做错误的事情printf“%s\n'”$…“
始终是安全的。如果x=-n
则echo“$x”
只打印printf“%s\n'”$x“
prints'-n”。同样的情况也发生在-e
和-e
上。此外,如果设置了xpg\u echo
,则echo
参数中的反斜杠转义序列将展开。
$ 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
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