如何使用 awk 或 sed 用其他单词替换每个单独出现的单词?

时间:2021-05-26 06:44:33

标签: shell awk sed

我想用另一个词替换一行 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 行。

2 个答案:

答案 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 调用的标准输出管道形成的标准输入.

相关问题