bash中两个不同的文件引用同时用于循环

时间:2019-04-10 19:21:00

标签: bash loops

有没有一种方法可以同时在for循环中使用两个不同的文件引用?像这样:

for file in file1 file2 file3; for name in name1 name2 name3
do
  awk 'FNR==NR{a[$1];next};($1 in a)' ${file}.txt ${name}.txt > ${name}_extract.txt
done

我也尝试了一个嵌套的for循环,该循环无效:

for file in file1 file2 file3
do
  for name in name1 name2 name3
  do
    awk 'FNR==NR{a[$1];next};($1 in a)' ${file}.txt ${name}.txt > ${name}_extract.txt
  done
done

我要实现的是从“ file1.txt”和“ name1.txt”中提取与其第一列匹配的行。反之亦然,file2.txt / name2.txt和file3.txt / name3.txt。

2 个答案:

答案 0 :(得分:2)

如果文件和名称确实称为file1file2file3name1name2name3,则可以做这样的事情:

for i in {1..3}; do
    printf '%s\n' "file: file$i, name: name$i"
done

您可以根据需要替换printf语句-重要的是如何访问文件和名称。

但是,如果它们具有任意名称,则必须执行以下操作:准备两个数组,然后遍历索引:

files=(file1 file2 file3)
names=(name1 name2 name3)
for (( i = 0; i < ${#files[@]}; ++i )); do
    printf '%s\n' "file: ${files[i]}, name: ${names[i]}"
done

答案 1 :(得分:1)

从这个问题出发,目前尚不清楚是要运行3次迭代还是9次。假设只需要运行3次迭代,我喜欢这种格式:

while read file name; do 
  ...
done << EOF
file1 name1
file2 name2
file3 name3
EOF