Bash 我应该使用for循环逐行处理文本文件吗?

Bash 我应该使用for循环逐行处理文本文件吗?,bash,for-loop,Bash,For Loop,所以我有两个文本文件 文件1:1-40个名称 文件2:1-40个名称 现在我想让程序(终端)遍历每个名称,在每个文件中递增一,这样来自FILE1的第一个名称运行来自FILE2的第一行,来自FILE1的第20个名称运行来自FILE2的第20行 但我不想让它先运行FILE1的名字,然后再运行FILE2中列出的所有名字,然后一遍又一遍地重复。 我应该做一个for循环吗 我想做一些类似的事情: for f in (cat FILE1); do flirt -in $f -ref (cat

所以我有两个文本文件

  • 文件1:1-40个名称
  • 文件2:1-40个名称
现在我想让程序(终端)遍历每个名称,在每个文件中递增一,这样来自FILE1的第一个名称运行来自FILE2的第一行,来自FILE1的第20个名称运行来自FILE2的第20行

但我不想让它先运行FILE1的名字,然后再运行FILE2中列出的所有名字,然后一遍又一遍地重复。 我应该做一个for循环吗

我想做一些类似的事情:

for f in (cat FILE1); do 
    flirt -in $f -ref (cat FILE2); 
done

我正在使用BASH进行此操作。

是的,您可以非常轻松地完成此操作,但它需要同时读取两个不同的文件描述符。您只需将其中一个文件重定向到下一个可用的文件描述符中,并使用它为您的读取循环提供数据,例如

while read f1var && read -u 3 f2var; do
    echo "f1var: $f1var -- f2var: $f2var"
done <file1.txt 3<file2.txt
示例使用

$ while read f1var && read -u 3 f2var; do \
echo "f1var: $f1var -- f2var: $f2var"; \
done <f1.txt 3<f2.txt
f1var: a -- f2var: d
f1var: b -- f2var: e
f1var: c -- f2var: f

是的,您可以很容易地做到这一点,但它需要同时读取两个不同的文件描述符。您只需将其中一个文件重定向到下一个可用的文件描述符中,并使用它为您的读取循环提供数据,例如

while read f1var && read -u 3 f2var; do
    echo "f1var: $f1var -- f2var: $f2var"
done <file1.txt 3<file2.txt
示例使用

$ while read f1var && read -u 3 f2var; do \
echo "f1var: $f1var -- f2var: $f2var"; \
done <f1.txt 3<f2.txt
f1var: a -- f2var: d
f1var: b -- f2var: e
f1var: c -- f2var: f

在Bash中,可以使用数组:

echo "Alice
> Bob
> Claire" > file-1

echo "Anton
Bärbel
Charlie" > file-2

n1=($(cat file-1))
n2=($(cat file-2))

for n in {0..2}; do echo ${n1[$n]} ${n2[$n]} ; done

Alice Anton
Bob Bärbel
Claire Charlie

在Bash中,可以使用数组:

echo "Alice
> Bob
> Claire" > file-1

echo "Anton
Bärbel
Charlie" > file-2

n1=($(cat file-1))
n2=($(cat file-2))

for n in {0..2}; do echo ${n1[$n]} ${n2[$n]} ; done

Alice Anton
Bob Bärbel
Claire Charlie

熟悉join和nl(数字线)不会错,因此这里有一种不同的方法:

nl -w 1 file-1 > file1
nl -w 1 file-2 > file2 
join -1 1 -2 1 file1 file2 | sed -r 's/^[0-9]+ //'
如果我们不告诉-w1,nl在小行号前面放上大量空格

我们通过匹配行号连接文件,然后使用sed删除行号


浆糊当然要优雅得多。我不知道这件事

熟悉join和nl(数字线)不会错,所以这里有一种不同的方法:

nl -w 1 file-1 > file1
nl -w 1 file-2 > file2 
join -1 1 -2 1 file1 file2 | sed -r 's/^[0-9]+ //'
如果我们不告诉-w1,nl在小行号前面放上大量空格

我们通过匹配行号连接文件,然后使用sed删除行号


浆糊当然要优雅得多。我不知道这件事

你用什么语言?bash?@aschepler是的,我在用bashSee。你在用什么语言?bash?@aschepler是的,我使用的是bashSee。如果文件很大,内存开销可能会很大。如果文件很大,内存开销可能会很大。