【问题标题】:I want to find some strings/words from column 1 and 2 in file1 that match column 1 in file2 and replace with column 2 strings/words in file2我想从 file1 中的第 1 列和第 2 列中找到一些与 file2 中的第 1 列匹配的字符串/单词,并替换为 file2 中的第 2 列字符串/单词
【发布时间】:2022-01-11 12:21:12
【问题描述】:

我仍在学习使用 Linux 平台进行编码。我已经搜索了与我类似的问题,但一旦我发现它们要么是特定的,要么只专注于更改整个第 1 列。

以下是我的文件示例:

文件 1

abc Gamma 3.44
bcd abc 5.77
abc Alpha 1.99
beta abc 0.88
bcd Alpha 5.66

文件 2

Gamma Bacteria
Alpha Bacteria
Beta Bacteria

输出文件3


abc Bacteria 3.44
bcd abc 5.77
abc Bacteria 1.99
Bacteria abc 0.88
bcd Bacteria 5.66

我尝试过: awk:

$ awk 'FNR==NR{a[$1]=$2;next} {if ($1,$2 in a){$1,$2=a[$1,$2]}; print $0}' file2 file1
$ awk 'NR==FNR {a[FNR]=$0; next} /$1|$2/ {$1 $2=a[FNR]} 1' file2 file1

他们给了我:

abc Gamma 3.44
abc 5.77
abc Alpha 1.99
Bacteria abc 0.88
bcd Alpha 5.66

仅更改 $1 并删除列 1 中未在 file2 $2 中找到的其他文本字符串

还有这个:

$ awk -F'\t' -v OFS='\t' 'FNR==1 { next }FNR == NR { file2[$1,$2] = $1 FS $2 } FNR != NR { file1[$1,$2,] = $1 FS $2} END { print "Match:"; for (k in file1) if (k in file1) print file2[k] # Or file1[k]}' file2 file1

没用

然后在我尝试了 sed 之后:

$ sed = file2 | sed -r 'N;s/(.*)\n(.*)/\1s|\&$|\2|/' | sed -f - file1

这给了我一个错误并抱怨 sed -e 没有被正确调用。

如果$1和$2或$2和$1相似,则只取最小的$3

文件 4

bcd abc 5.77
Bacteria abc 0.88
bcd Bacteria 5.66

我试过这段代码:

$ awk 'NR == $1&$2 || $3 < min {line = $0; min = $3}END{print line}' file3
$ awk '/^$1/{if(h){print h RS m}min=""; h=$0; next}min=="" || $3 < min{min=$3; m=$0}END{print h RS m}' file3
$ awk -F'\t' '$3 != "NF==min"' OFS='\t' file3
$ awk -v a=NODE '{c=a*$3+(1-a)} !($1 in min) || c<min[$1]{min[$1]=c; minLine[$1]=$0} END{for(k in minLine) print minLine[k]}' file3 | column -t

一切都不起作用,我试图研究每行的含义并对其进行更改以适应我的问题。但都失败了

【问题讨论】:

    标签: linux awk sed


    【解决方案1】:

    这可能对你有用(GNU sed):

    sed -E 's#(.*) (.*)#/^\1 /Is/\\S+/\2/;/^\\S+ \1 /Is/\\S+/\2/2#' file2 |
    sed -Ef - file1
    

    从 file2 生成一个 sed 脚本,该脚本针对 file1 运行以生成所需的格式。

    【讨论】:

    • 我尝试了 sed 脚本我得到了这个错误:sed: file - line 172: unknown command: `2'
    • @David file2 中除了单词之外还有其他内容吗?
    • 是的,file2 列的物种名称为“Escherichia~coli~2”,第 1 列和第 2 列中的 file1 都是这样的
    • @David 第 172 行呢?可能某些字符出现在正则表达式中时可能需要转义。
    • 第 172 行有“Enterobacteria~sp~DT571/2”会抱怨那个“/2”
    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 2018-08-06
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2016-09-30
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多