用awk修改重复字段
amending duplicated field with awk
我有一个包含两个制表符分隔列的文件,一个是 ID 列,一个是序列列。
122_mex1 TGCAGGC
122_mex1 TGAAAAA
122_mex2 TGCAGTC
122_mex2 TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGC
我想为具有重复 ID(第 1 列)的每一行修改 ID 列(第 1 列)的结尾——在这个玩具数据集中,结果将是更改 122_mex1 和 122_mex2,在这些行的 ID 上附加一个 "b":
122_mex1 TGCAGGC
122_mex1b TGAAAAA
122_mex2 TGCAGTC
122_mex2b TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGC
而所有其他没有任何重复的行将按原样打印。
关于如何实现这一点有什么想法吗?
谢谢,
LP
这是一个使用 GNU awk 测试的 awk 脚本 (doubles.awk
):
BEGIN { IFS = OFS = "\t" }
1 {
print ids[ ],
ids[ ] = "b"
}
假设您的输入在 doubles.csv
、运行 脚本中 awk -f doubles.awk doubles.csv
。
如果有任意多的潜在重复项,我会选择 perl:
perl -lane '
if ($. > 1) {
if ($prev ne $F[0]) {
$ext = "";
} else {
$ext ||= "a"; # so we start with "b"
++$ext;
}
}
$prev = $F[0];
$F[0] .= $ext;
print join(" ", @F);
' file
perl 有一个奇怪的特性,其中 ++
运算符可以递增字符串:"a" => "b", ... "z" => "aa" , "aa" => "ab", 等等
这假定您的输入文件按 ID
排序
另一个awk
$ awk 'BEGIN{FS=OFS="\t"} {=(a[]++?"b":"")}1' file
122_mex1 TGCAGGC
122_mex1b TGAAAAA
122_mex2 TGCAGTC
122_mex2b TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGC
我有一个包含两个制表符分隔列的文件,一个是 ID 列,一个是序列列。
122_mex1 TGCAGGC
122_mex1 TGAAAAA
122_mex2 TGCAGTC
122_mex2 TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGC
我想为具有重复 ID(第 1 列)的每一行修改 ID 列(第 1 列)的结尾——在这个玩具数据集中,结果将是更改 122_mex1 和 122_mex2,在这些行的 ID 上附加一个 "b":
122_mex1 TGCAGGC
122_mex1b TGAAAAA
122_mex2 TGCAGTC
122_mex2b TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGC
而所有其他没有任何重复的行将按原样打印。
关于如何实现这一点有什么想法吗?
谢谢, LP
这是一个使用 GNU awk 测试的 awk 脚本 (doubles.awk
):
BEGIN { IFS = OFS = "\t" }
1 {
print ids[ ],
ids[ ] = "b"
}
假设您的输入在 doubles.csv
、运行 脚本中 awk -f doubles.awk doubles.csv
。
如果有任意多的潜在重复项,我会选择 perl:
perl -lane '
if ($. > 1) {
if ($prev ne $F[0]) {
$ext = "";
} else {
$ext ||= "a"; # so we start with "b"
++$ext;
}
}
$prev = $F[0];
$F[0] .= $ext;
print join(" ", @F);
' file
perl 有一个奇怪的特性,其中 ++
运算符可以递增字符串:"a" => "b", ... "z" => "aa" , "aa" => "ab", 等等
这假定您的输入文件按 ID
排序另一个awk
$ awk 'BEGIN{FS=OFS="\t"} {=(a[]++?"b":"")}1' file
122_mex1 TGCAGGC
122_mex1b TGAAAAA
122_mex2 TGCAGTC
122_mex2b TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGC