打印由第二个文件索引的行

2023-12-04

我有两个文件:

  1. 包含字符串的文件(新行终止)
  2. 包含整数的文件(每行一个)

我想打印第一个文件中由第二个文件中的行索引的行。我目前的解决方案是这样做

while read index
do
    sed -n ${index}p $file1
done < $file2

它本质上是逐行读取索引文件并运行 sed 来打印该特定行。问题是对于大型索引文件(成千上万行)来说速度很慢。

是否可以更快地做到这一点?我怀疑 awk 在这里很有用。

我尽力搜索,但只能找到尝试打印行范围而不是通过第二个文件进行索引的人。

UPDATE

索引一般不会被打乱。这些行应该按照索引文件中索引定义的顺序出现。

EXAMPLE

File 1:

this is line 1
this is line 2
this is line 3
this is line 4

File 2:

3
2

预期输出是:

this is line 3
this is line 2

如果我理解正确的话,那么

awk 'NR == FNR { selected[$1] = 1; next } selected[FNR]' indexfile datafile

应该可以工作,假设索引按升序排序,或者您希望在数据文件中按行的顺序打印行,而不管索引的排序方式如何。其工作原理如下:

NR == FNR {         # while processing the first file
  selected[$1] = 1  # remember if an index was seen
  next              # and do nothing else
}
selected[FNR]       # after that, select (print) the selected lines.

如果索引未排序,则应按行在索引中出现的顺序打印行:

NR == FNR {               # processing the index:
  ++counter
  idx[$0] = counter       # remember that and at which position you saw
  next                    # the index
}
FNR in idx {              # when processing the data file: 
  lines[idx[FNR]] = $0    # remember selected lines by the position of
}                         # the index
END {                     # and at the end: print them in that order.
  for(i = 1; i <= counter; ++i) {
    print lines[i]
  }
}

这也可以内联(后面加分号)++counter and index[FNR] = counter,但我可能会把它放在一个文件中,比如说foo.awk,然后运行awk -f foo.awk indexfile datafile。带有索引文件

1
4
3

和一个数据文件

line1
line2
line3
line4

这将打印

line1
line4
line3

剩下的警告是,这假设索引中的条目是唯一的。如果这也是一个问题,您将必须记住索引位置列表,在扫描数据文件时将其拆分并记住每个位置的行。那是:

NR == FNR {               
  ++counter
  idx[$0] = idx[$0] " " counter  # remember a list here
  next
}
FNR in idx {              
  split(idx[FNR], pos)    # split that list
  for(p in pos) {
    lines[pos[p]] = $0    # and remember the line for
                          # all positions in them.
  }
}
END {
  for(i = 1; i <= counter; ++i) {
    print lines[i]
  }
}

最后,这与问题中的代码功能等效。您必须决定用例的复杂程度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打印由第二个文件索引的行 的相关文章

  • bash:使用 scp 检查远程文件是否存在

    我正在编写一个 bash 脚本来将文件从远程服务器复制到本地计算机 我需要检查该文件是否可用 以便在该文件不存在时可以采取替代操作 我知道如何测试本地文件是否存在 但是 使用 scp 会使事情变得有点复杂 常识告诉我 一种方法是无论如何尝试
  • 通过 SSH 启动长时间运行的程序 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个运行 Ubuntu 的虚拟机 并且我可以通过 SSH 很好地连接到该虚拟机 我什至可以使用以下命令通过 SSH 启动我的 pyth
  • 如何使用 awk 将 mac addr 转换为 int?

    Input 192 168 0 1 aa bb cc 00 11 22 192 168 0 1 aa 00 bb 11 cc 22 192 168 10 11 2a bb cc 20 11 22 192 168 10 11 aa 02 bb
  • sed(和其他)会损坏非 ASCII 文件吗?

    如果我编写一些操作文件的脚本 例如使用 sed 进行搜索 替换 并且文件可以采用各种字符集 那么文件是否会损坏 我希望替换的文本是 ASCII 并且也仅出现在仅包含 ASCII 的文件中的行上 但其余行包含其他字符集中的字符 如果您的字符集
  • Bash:执行命令时超时/文件溢出终止

    我正在用 bash 编写一个模拟评分脚本 它应该执行一个 C 程序 该程序将给出一些输出 我将其重定向到一个文件 我试图 1 使其在一定持续时间后超时 并且 2 如果输出文件到达某个文件则终止尺寸限制 不知道如何解决这两个问题 有什么帮助吗
  • 有没有办法在 MacOSX 上使用 Xcode 将 bash shell 脚本与 AppleScriptObjC 应用程序一起打包?

    我正在尝试使用 AppleScriptObjC 作为包装器来自动化三个或四个 bash shell 脚本 这将为我提供一个友好的 GUI 前端来选择数据文件等 以及方便的文本文件操作和多个 bash 脚本的处理 一切正常 我可以按下按钮并运
  • 第三行的总和并相应地划分行

    我有一个如下的文件 其中有 n 行 我想计算其总和 基于第三列 并将行相应地分布在 3 个不同的文件中 基于每个文件的总和 例如 如果我们将所有第三列值相加 则总数为 516 如果我们将其除以 3 则为 172 所以我想向文件添加一行 使其
  • 通过多个换行符分割文件

    假设您有以下输入文件 Some text It may contain line breaks Some other part of the text Yet an other part of the text 并且您想要迭代每个文本部分
  • 通过匹配模式将字符串替换为另一个文本文件中的行

    我有一个带有对应键 gt 值的文件 sort keyFile txt head ENSMUSG00000000001 ENSMUSG00000000001 Gnai3 ENSMUSG00000000003 ENSMUSG0000000000
  • 如何防止 Conda 默认激活基础环境?

    我最近在我的 Mac 上安装了 anaconda2 默认情况下 Conda 配置为在我打开新的终端会话时激活基本环境 我想要访问 Conda 命令 即我想要将 Conda 的路径添加到我的 PATHConda 在初始化时会执行此操作 所以没
  • 为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

    例如 此行失败 nohup for i in mydir fasta do myscript sh i done gt output txt bash syntax error near unexpected token do 正确的做法是
  • 如何在shell脚本中扩展相对路径

    我正在编写一个脚本来使用 bash 在 linux 2 6 上设置环境变量 因此该脚本包含如下命令 export SRC DIR export LIBPATH SRC DIR lib 问题是 当我尝试 echo LIBPATH 时 它显示
  • Bash 脚本在 for 循环中使用 sed 和变量?

    我正在尝试编写一个 bash 脚本 该脚本需要一些变量 然后使用 grep 对给定文件搜索进行查找 替换 以获取包含该字符串的文件列表 我认为我遇到的问题是在 sed 中看到变量我不确定它可能是什么 if searchFiles a old
  • $@ 中 args 的 bash 参数大小写

    我有一个带有一长串可选参数的脚本 有些具有相关的值 Such as script first 2012 12 25 last 2012 12 26 copy remove script first 2012 12 25 因此有以下案例陈述
  • 为什么我不能用这个循环从 bash 历史记录中删除多个条目

    这个循环将显示我想要做的事情 但是如果我删除echo从中 它实际上不会删除任何内容 history grep 0 5 0 9 ls cut c1 5 while read id do echo history d id done 我添加了缩
  • 在詹金斯管道作业中将变量传递给bash脚本

    我有一个 Jenkins 管道作业 其中我使用名为 setup sh 的 bash 脚本配置我的环境 如下所示 bin bash export ARCH 1 echo architecture ARCH 在 Jenkins 管道脚本中 我使
  • 将匹配的值传递给函数,并替换为返回值

    我如何让 Bash 匹配正则表达式 而不是用常量字符串替换值 而是将匹配的值传递给函数 然后从函数的返回值中获取要替换的值 像下面的伪代码一样 它替换了每一个匹配项 a d 具有相同的字符 但大写 function uppercase ec
  • 错误:选项“Z”仅在夜间编译器上被接受[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在通过斯坦福操作系统课程 cs140e https web stanford edu class cs140e 其中一个问题是 有一个名
  • PS1 定义中的条件 pwd

    我想显示当前工作目录如果我处于symlink比没有 到目前为止我已经 pwd P pwd echo 1 31m pwd P echo 1 32m pwd 将返回所需的输出 但它不能替代 w在命令提示符下 我尝试用反引号括起来 但这只会导致p
  • Bash:将输出传输到后台进程?

    我想将一个进程放入后台 然后多次将数据传递给它 例如 cat The command I want to write into cat pid Getting the process id of the cat process echo h

随机推荐