【问题标题】:Access same index records from two different files UNIX从两个不同的文件 UNIX 访问相同的索引记录
【发布时间】:2015-09-01 01:42:40
【问题描述】:

我有 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 代码。如果不是这种方式,任何人都可以在可能的情况下提供其他方式的帮助。

请帮忙。

【问题讨论】:

  • 你在使用什么 shell,for 循环在哪里工作?在 zsh、bash 和 tcsh 中,它只回显文件名一次,然后循环结束。
  • 我已经编辑了我的问题。请看

标签: bash shell unix


【解决方案1】:
% 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
% 

【讨论】:

  • 我想在一个循环中工作,这样我就可以处理两个文件中的第一个数据等等。
  • 那么做吗? paste data record | while read a b c d; do echo $d $c $b $a; done
【解决方案2】:

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

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

在 bash 中同时读取多个文件很棘手。使用多个文件句柄被一些人认为是“高级的”。

这样的 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,用于文件 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】:
    exec 3< file2
    while read -r line1; do read -r line2 <&3; echo "$line1 $line2"; done < file1
    

    输出:

    数据 1 记录 1 数据 2 记录 2 数据 3 记录 3 数据 4 记录 4

    【讨论】:

      【解决方案4】:

      其他人给你的类似建议,但我会在 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多