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

时间:2018-02-04 01:59:46

标签: bash for-loop

所以我有两个文本文件

  • FILE1:1-40名称
  • FILE2:1-40名称

现在我想要程序做什么(终端)是通过每个文件中的每个文件递增一个名称,以便FILE1中的第一个名称从FILE2运行第一行,而第二个名称来自FILE1运行第20个名称来自FILE2的一行。

但我不想要运行FILE1的第一个名称,然后运行FILE2中列出的所有名称,并反复重复。 我应该做一个for循环吗?

我在想做类似的事情:

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

我是用BASH做的。

3 个答案:

答案 0 :(得分:4)

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

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

从每个文件逐行读取,从标准文件描述符上的file1.txtf1var的{​​{1}}以及fd3上的file2.txtf2var

一个简短的例子可能会有所帮助:

示例输入文件

$ cat f1.txt
a
b
c

$ cat f2.txt
d
e
f

使用示例

$ 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

使用paste替代

paste实用程序还提供了逐行组合文件的简单替代方法,例如:

$ paste f1.txt f2.txt
a       d
b       e
c       f

答案 1 :(得分:0)

在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

答案 2 :(得分:0)

熟悉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]+ //'
如果我们不告诉-w 1,那么在小行号前加上大量的空白。

我们通过匹配行号加入文件,然后用sed删除行号。

粘贴当然要优雅得多。我不知道这件事。