根据另一个文件的字符编辑一个文件中的字符

问题描述 投票:0回答:2

我有一个如下所示的 .ind 文件:

    I001.HO M Ignore_Iran_Zoroastrian_PCA_outlier.HO
    I002.HO M Ignore_Iran_Zoroastrian_PCA_outlier.HO
    IREJ-T006.HO M Iran_Fars.HO
    IREJ-T009.HO M Iran_Fars.HO
    IREJ-T022.HO M Iran_Fars.HO
    IREJ-T023.HO M Iran_Fars.HO
    IREJ-T026.HO M Iran_Fars.HO
    IREJ-T027.HO M Iran_Fars.HO
    IREJ-T037.HO M Iran_Fars.HO
    IREJ-T040.HO M Iran_Fars.HO

并且我正在尝试将其子集仅适用于某些个人。因此,我在 .txt 文件中有一个所需人员的列表,如下所示:

   IREJ-T026.HO 
   IREJ-T027.HO
   IREJ-T037.HO
   IREJ-T040.HO

然而,带有convertf的eigensoft子集仅采用总体名称而不是个体名称。正如您所看到的,来自同一种群的个体具有相同的种群名称(Iran_Fars.HO)。

如何遍历第一个文件并仅查找第二个文件中列出的个体的行,然后将“_B”附加到人口名称的末尾,以便列表中的那些个体与其他人具有不同的人口名称?

提前致谢!

我一直在尝试以某种方式使用 awk 或 sed,但我是新手,我无法弄清楚

linux database awk sed culling
2个回答
0
投票

如果我理解正确的话,这可以简单地在

awk
中完成。如果您有
file.ind
并且其中包含

    I001.HO M Ignore_Iran_Zoroastrian_PCA_outlier.HO
    I002.HO M Ignore_Iran_Zoroastrian_PCA_outlier.HO
    IREJ-T006.HO M Iran_Fars.HO
    IREJ-T009.HO M Iran_Fars.HO
    IREJ-T022.HO M Iran_Fars.HO
    IREJ-T023.HO M Iran_Fars.HO
    IREJ-T026.HO M Iran_Fars.HO
    IREJ-T027.HO M Iran_Fars.HO
    IREJ-T037.HO M Iran_Fars.HO
    IREJ-T040.HO M Iran_Fars.HO

而且,您的

file2.txt
包含:

   IREJ-T026.HO
   IREJ-T027.HO
   IREJ-T037.HO
   IREJ-T040.HO

并且,您想要将

_B
附加到
file.ind
中的所有记录,并且第一个字段与
file2.txt
中的记录匹配,您可以执行类似以下操作:

awk 'FNR == NR { a[$1]++; next } {if ($1 in a) { $0=$0 "_B" }; print}' file2.txt file.ind

示例使用/输出

$ awk 'FNR == NR { a[$1]++; next } {if ($1 in a) { $0=$0 "_B" }; print}' file2.txt file.ind
    I001.HO M Ignore_Iran_Zoroastrian_PCA_outlier.HO
    I002.HO M Ignore_Iran_Zoroastrian_PCA_outlier.HO
    IREJ-T006.HO M Iran_Fars.HO
    IREJ-T009.HO M Iran_Fars.HO
    IREJ-T022.HO M Iran_Fars.HO
    IREJ-T023.HO M Iran_Fars.HO
    IREJ-T026.HO M Iran_Fars.HO_B
    IREJ-T027.HO M Iran_Fars.HO_B
    IREJ-T037.HO M Iran_Fars.HO_B
    IREJ-T040.HO M Iran_Fars.HO_B

如果这不是您要问的,请告诉我。我很高兴能提供进一步的帮助。我也会编辑并填写它的工作原理。


0
投票

使用这个 Perl 一行代码:

perl -lane 'BEGIN { %req = map { chomp; $_ => 1 } `cat required.txt`; } if ( $req{ $F[0] } ) { $F[2] .= "_B" } print join "\t", @F;' infile.ind > outfile.ind

Perl 单行代码使用这些命令行标志:

-e
:告诉 Perl 查找内联代码,而不是在文件中。
-n
:一次循环输入一行,默认将其分配给
$_

-l
:在内联执行代码之前删除输入行分隔符(默认情况下在 *NIX 上为
"\n"
),并在打印时附加它。
-a
:在空格或
$_
选项中指定的正则表达式上将
@F
拆分为数组
-F

BEGIN { ... }
:在执行
-n
或其他选项指定的任何隐式循环之前执行此块内的代码。
%req = map { chomp; $_ => 1 } `cat required.txt`;
:将整个
required.txt
文件读取到哈希
%req
中,其中键是每一行(删除了终端换行符),值是
1

if ( $req{ $F[0] } ) { $F[2] .= "_B" } 
:如果在
$F[0]
哈希中找到第一个字段 (
%req
),请将
_B
附加到第三个字段(
$F[2]
,或人口)。
print join "\t", @F;
: 打印所有由 TAB 分隔的字段。

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.