我有一個包含內容的檔案 data.txt
2013-04-24;1;0.1635;1.4135;fp.3.Luci_02C06.ctg.ctg7180000085546
2013-04-24;1;0.9135;1.4135;fp.3.Luci_01A01.ctg.ctg7180000038386
2017-04-24;2;0.9135;1.4135;fp.3.Luci_02C06.ctg.ctg7180000085546
2011-04-24;2;0.9135;1.4135;fp.3.Luci_02C06.ctg.ctg7180000085546
2012-04-24;2;0.9135;1.4135;fp.3.Luci_02C06.ctg.ctg7180000085549
2016-04-24;2;0.9135;1.4135;fp.3.Luci_02C06.ctg.ctg7180000085549
2016-04-24;2;0.9135;1.4335;fp.3.Luci_02C06.ctg.ctg7180000085549
2013-04-24;1;0.9135;1.4135;fp.3.Luci_01A01.ctg.ctg7180000038386
2011-04-24;2;0.9135;1.4135;fp.3.Luci_02C06.ctg.ctg7180000085546
和另一個包含內容的檔案lookup.txt
1;2012-04-24;2ab1e4c0-de4d-11e2-a934-0f0479162b1b;fp.3.Luci_02C06.ctg.ctg7180000085546
7;2013-04-24;2ab21e90-de4d-11e2-9ce8-d368d9512bad;fp.3.Luci_01A01.ctg.ctg7180000038386
3;2014-04-24;2ab2582e-de4d-11e2-bb5f-6b1f6c4437f8;fp.3.Luci_02C06.ctg.ctg7180000085549
我想根據lookup.txt中第4列中的匹配值將data.txt中的第5列替換為lookup.txt中的第1列。我想要的結果是
2013-04-24;1;0.1635;1.4135;1
2013-04-24;1;0.9135;1.4135;7
2017-04-24;2;0.9135;1.4135;1
2011-04-24;2;0.9135;1.4135;1
2012-04-24;2;0.9135;1.4135;3
2016-04-24;2;0.9135;1.4135;3
2016-04-24;2;0.9135;1.4335;3
2013-04-24;1;0.9135;1.4135;7
2011-04-24;2;0.9135;1.4135;1
我在另一篇文章中發現了以下看起來很有希望的 shell 腳本
awk -F';' 'NR==FNR{a[$4]=$1;next}{$5=a[$5]}1' lookup.txt data.txt
但由于某種原因,下面的結果將第 5、6、7 和 9 行的第 5 列留空。為什么?我們得到空格分隔符而不是“;”的事實 也是一個問題,但不那么重要
2013-04-24 1 0.1635 1.4135 1
2013-04-24 1 0.9135 1.4135 7
2017-04-24 2 0.9135 1.4135 1
2011-04-24 2 0.9135 1.4135 1
2012-04-24 2 0.9135 1.4135
2016-04-24 2 0.9135 1.4135
2016-04-24 2 0.9135 1.4335
2013-04-24 1 0.9135 1.4135 7
2011-04-24 2 0.9135 1.4135
uj5u.com熱心網友回復:
您可以使用此awk解決方案:
awk '
BEGIN{FS=OFS=";"}
{
sub(/\r$/, "")
}
NR == FNR {
map[$NF] = $1
next
}
{
$NF = map[$NF]
} 1' lookup.txt data.txt
2013-04-24;1;0.1635;1.4135;1
2013-04-24;1;0.9135;1.4135;7
2017-04-24;2;0.9135;1.4135;1
2011-04-24;2;0.9135;1.4135;1
2012-04-24;2;0.9135;1.4135;3
2016-04-24;2;0.9135;1.4135;3
2016-04-24;2;0.9135;1.4335;3
2013-04-24;1;0.9135;1.4135;7
2011-04-24;2;0.9135;1.4135;1
解釋:
BEGIN{FS=OFS=";"}:將輸入和輸出欄位分隔符設定為;- 在兩個檔案中一致地使用
NF而不是編號列 sub(/\r$/, "")是從行尾洗掉任何回車字符
uj5u.com熱心網友回復:
NF通過在該步驟中取消,它與顯式使用陳述句FNR==NR具有相同的效果。next
如果您非常確定替換值永遠不會為零,那么最終條件可以簡化為$NF = __[$NF]
mawk 'FNR==NR { NF=_*(__[$NF]=$!_) }_!~($NF=__[$NF])' RS='[\r]?[\n]'
FS=';'
OFS=';' test_lookup_0005.txt
test_data_0005.txt
2013-04-24;1;0.1635;1.4135;1
2013-04-24;1;0.9135;1.4135;7
2017-04-24;2;0.9135;1.4135;1
2011-04-24;2;0.9135;1.4135;1
2012-04-24;2;0.9135;1.4135;3
2016-04-24;2;0.9135;1.4135;3
2016-04-24;2;0.9135;1.4335;3
2013-04-24;1;0.9135;1.4135;7
2011-04-24;2;0.9135;1.4135;1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477078.html
