我想用另一个词替换一行 5 列中出现的每个词。
这是我的文件(每列由一个制表符分隔,当一列有多个彼此相同的条目时,它们用 ,
(逗号)分隔,如 "A_V,A_V,A_V,A_V"
)。>
g1 A_chrococcum_B3__ACG10_RS21915 A_chrococcum_NCIMB8003__Achr_RS24720 "A_salinestris__GCU53_RS00995,A_salinestris__GCU53_RS13820,A_salinestris__GCU53_RS25085,A_salinestris__GCU53_RS00050,A_salinestris__GCU53_RS24715" "A_vinelandii_CA__AVCA_RS25530,A_vinelandii_CA__AVCA_RS00340,A_vinelandii_CA__AVCA_RS07835,A_vinelandii_CA__AVCA_RS09930,A_vinelandii_CA__AVCA_RS10910,A_vinelandii_CA__AVCA_RS11470,A_vinelandii_CA__AVCA_RS15230,A_vinelandii_CA__AVCA_RS21030,A_vinelandii_CA__AVCA_RS13765,A_vinelandii_CA__AVCA_RS06150,A_vinelandii_CA__AVCA_RS20865" "A_vinelandii_DJ__AVIN_RS25600,A_vinelandii_DJ__AVIN_RS00380,A_vinelandii_DJ__AVIN_RS07870,A_vinelandii_DJ__AVIN_RS09960,A_vinelandii_DJ__AVIN_RS10940,A_vinelandii_DJ__AVIN_RS11500,A_vinelandii_DJ__AVIN_RS15260,A_vinelandii_DJ__AVIN_RS06190,A_vinelandii_DJ__AVIN_RS13795,A_vinelandii_DJ__AVIN_RS20895"
第一列的值是我想单独替换所有其他列的值。
我正在寻找这样的输出(第一个列(我想替换的字符串))。在第一个 col COL-1 只有一次出现因此只有一个 g1,COL-2 也只有一次出现因此只有一个 g1,COL-3 有 5 个出现,因此,五个 g1,COL-4 有 11 个出现因此 11 g1 和以此类推。
g1 g1 g1 "g1,g1,g1,g1,g1" "g1,g1,g1,g1,g1,g1,g1,g1,g1,g1,g1" "g1,g1,g1,g1,g1,g1,g1,g1,g1,g1"
我尝试对第一行执行此操作,并认为我可以为文件的其余部分循环它。还因为我不知道如何一次对所有列执行此操作。
我正在尝试的命令:
grep -w "g1" f1 |
awk -F"\t" '{ gsub("A_.*,","g1",$4); print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}'
它给了我这样的结果:
g1 A_chrococcum_B3__ACG10_RS21915 A_chrococcum_NCIMB8003__Achr_RS24720 "g1A_salinestris__GCU53_RS24715" "A_vinelandii_CA__AVCA_RS25530,A_vinelandii_CA__AVCA_RS00340,A_vinelandii_CA__AVCA_RS07835,A_vinelandii_CA__AVCA_RS09930,A_vinelandii_CA__AVCA_RS10910,A_vinelandii_CA__AVCA_RS11470,A_vinelandii_CA__AVCA_RS15230,A_vinelandii_CA__AVCA_RS21030,A_vinelandii_CA__AVCA_RS13765,A_vinelandii_CA__AVCA_RS06150,A_vinelandii_CA__AVCA_RS20865" "A_vinelandii_DJ__AVIN_RS25600,A_vinelandii_DJ__AVIN_RS00380,A_vinelandii_DJ__AVIN_RS07870,A_vinelandii_DJ__AVIN_RS09960,A_vinelandii_DJ__AVIN_RS10940,A_vinelandii_DJ__AVIN_RS11500,A_vinelandii_DJ__AVIN_RS15260,A_vinelandii_DJ__AVIN_RS06190,A_vinelandii_DJ__AVIN_RS13795,A_vinelandii_DJ__AVIN_RS20895"
怎么做?我的文件中有 677779 行。
答案 0 :(得分:4)
您可以使用此awk
:
awk 'BEGIN {FS=OFS="\t"} {for (i=2; i<=NF; ++i) gsub(/[^",]+/, $1, $i)} 1' file
g1 g1 g1 "g1,g1,g1,g1,g1" "g1,g1,g1,g1,g1,g1,g1,g1,g1,g1,g1" "g1,g1,g1,g1,g1,g1,g1,g1,g1,g1"
答案 1 :(得分:0)
这可能对你有用(GNU sed):
sed -E 's#^(\S+).*#/^\1/s/[^"\\t,]+/\1/g#' file | sed -Ef - file
从源文件创建一个 sed 脚本,用该行的第一个字段替换每一行中的每个字段。
使用原始源文件作为输入调用 sed 脚本。
注意通过使用 -f -
命令行选项将 sed 脚本传递给第二次 sed 调用,该选项评估 sed 命令文件,该文件是从第一次 sed 调用的标准输出管道形成的标准输入.