【问题标题】:Trying to use variable in sed or awk尝试在 sed 或 awk 中使用变量
【发布时间】:2014-03-12 11:56:54
【问题描述】:

我有 2 个单独的文本文件,每个文件的格式完全相同。我可以 grep FILE1.txt 查找特定搜索词并输出每个匹配项的行号。行号以数字顺序输出到文件或变量。

我想使用每个行号并将该行从FILE2.txt 按数字顺序打印到单个OUTPUT.txt。有谁知道一种方法,使用awksed 来做到这一点?

我有一个值为 25 26 27 28 的字符串变量 $linenumbers。

我使用以下命令:

for i in $linenumbers;做 sed -n "/$I/p" $i test_read2.fastq >> test.fastq;完成。

我得到了

的错误

sed: can't read 25: No such file or directory

sed: 无法读取 26: 没有这样的文件或目录

sed: 无法读取 27: 没有这样的文件或目录

sed: 无法读取 28: 没有这样的文件或目录

如果我一个一个地执行这个 sed 命令,我可以从文件中提取第 25、26、27 和 28 行,并使用以下命令将其打印到文件中;

sed -n "25p" test_read2.fastq >> test.fastq

我想用变量替换“25p”,这样它就可以从文件中提取多行(25,26,27,28),而不是一一执行...

【问题讨论】:

  • 请向我们展示您尝试过的一些代码。
  • @user3406833,给出一些输入和输出?

标签: awk sed grep fastq


【解决方案1】:

试试这个:

grep -n interesting FILE1.txt | cut -d: -f1 | while read l
do
   sed -n "$l p" FILE2.txt
done

例子:

$ cat FILE1.txt 
foo
bar
baz
$ cat FILE2.txt 
qux
quux
quuux
$ grep -n bar FILE1.txt | cut -d: -f1 | while read l; do sed -n "$l p" FILE2.txt; done
quux

【讨论】:

    【解决方案2】:

    不确定您到底想做什么。如果你想打印在lines 中定义的file 的行,你可以做awk 'NR==FNR{a[$0];next}FNR in a' lines file

    测试:

    $ cat lines
    1
    3
    7
    $ cat file
    a
    b
    c
    d
    e
    f
    g
    
    $ awk 'NR==FNR{a[$0];next}FNR in a' lines file
    a
    c
    g
    

    【讨论】:

    • 感谢您的回复!我将您的 awk 命令与以下内容一起使用: > awk 'NR==FNR{a[$0];next}FNR in a' $linenumbers test_read2.fastq。这给了我一个错误:awk:无法打开 25(没有这样的文件或目录)。这很奇怪,因为 25 是我试图从 test_read2.fastq 文件中检索的行号。
    • 我假设这些行存储在一个文件中。如果$linenumbers 是保存行号的变量,那么您应该改用进程替换:awk 'NR==FNR{a[$0];next}FNR in a' <(echo "$linenumbers") test_read2.fastq
    • 谢谢!!!!做到了!!!我还用一个文件尝试了你的第一个建议,它也很有效……你已经结束了我整天寻找这个答案的过程!
    【解决方案3】:
    sed -n "` grep -n 'Yourpattern' File1.txt | sed 's/:.*/p/'`" File2.txt
    

    注意YourPattern中的替换和(双)引号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-25
      • 2017-11-12
      • 2017-04-23
      • 1970-01-01
      • 2019-01-17
      • 2014-04-11
      • 2012-01-24
      • 1970-01-01
      相关资源
      最近更新 更多