我有一个如下所示的 .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,但我是新手,我无法弄清楚
如果我理解正确的话,这可以简单地在
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
如果这不是您要问的,请告诉我。我很高兴能提供进一步的帮助。我也会编辑并填写它的工作原理。
使用这个 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 分隔的字段。