从两个不同的文件UNIX访问相同的索引记录

时间:2015-08-31 16:18:39

标签: bash shell unix

我将file1.txt作为

data 1
data 2
data 3
data 4

同样我还有另一个file2.txt

record 1
record 2
record 3
record 4

在这两种情况下,我都有相同数量的记录。

我可以通过

访问file1.txt中的每一行
for line in file1.txt
echo $line

我想从单循环中的两个文件中访问第一条记录,依此类推。之所以我希望从单个循环中的两个文件中首先记录,因为我将基于这两个数据生成html代码。如果不是这样,任何人都可以帮助其他方式。

请帮助。

4 个答案:

答案 0 :(得分:2)

% cat data
data 1
data 2
data 3
% cat record 
record 1
record 2
record 3
% paste data record
data 1  record 1
data 2  record 2
data 3  record 3
% 

答案 1 :(得分:1)

exec 3< file2
while read -r line1; do read -r line2 <&3; echo "$line1 $line2"; done < file1

输出:

data 1 record 1
data 2 record 2
data 3 record 3
data 4 record 4

答案 2 :(得分:1)

paste命令可能会对您有所帮助,如果您要执行的操作是逐行加入文件。它不是bash的一部分,它是自1979年以来几乎在每个unix系统上安装的工具。: - )

$ cat record
ONE
TWO
THREE
$ cat data
one
two
three
$ paste record data
ONE     one
TWO     two
THREE   three

在bash中同时从多个文件中读取是很棘手的。一些人认为使用多个文件句柄是&#34;高级&#34;。

这样的bash脚本可能就是这样。

#!/usr/bin/env bash

exec 3< data

while read left; do
  read right <&3
  echo "$left /// $right"     # or whatever you need to do
done < record

这将打开文件句柄3上的文件data(保留文件句柄0,文件句柄0,文件record),并逐步读取每个文件,从两者中读取。

或者,如果您希望以不同的方式处理文本,可以使用awk bash,但通常安装在安装了bash的任何位置):

awk '{getline B < "data"; print $0 "\t" B;}' record > combined.txt

这将逐行浏览每个文件,打开两个文件并从每个文件中读取一行。它的优点是不需要大量内存来存储文件。

或者,更高性能的解决方案是将一个文件存储在一个数组的内存中,然后逐行处理另一个文件:

awk 'NR==FNR{a[NR]=$0;next;} {print $0 "\t" a[FNR];}' record data

在任何一种情况下,用您需要的任何处理替换print函数。

答案 3 :(得分:1)

其他人给你的类似建议,但我会在一个while循环的条件下从每个文件中读取:

while IFS= read -r -u3 data && IFS= read -r -u4 record; do
    echo "$data => $record"
done 3< file1.txt 4< file2.txt

输出

data 1 => record 1
data 2 => record 2
data 3 => record 3
data 4 => record 4
相关问题