【发布时间】: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
一切都不起作用,我试图研究每行的含义并对其进行更改以适应我的问题。但都失败了
【问题讨论】: