如何解决转换表替换其他文件中的所有元素
我正在尝试将制表符分隔文件中的所有 ICD 代码转换为 Phecodes(基于 ICD-Phecode 转换表制表符分隔文件),用于生物生物信息学项目。我从下面的 stackoverflow 帖子中找到了一个很好的起点:
awk 'NR==1 { next } FNR==NR { a[$1]=$2; next } $1 in a { $1=a[$1] }1' TABLE OLD_FILE
Replacing values in large table using conversion table
但我不希望“第一列中的所有值都根据转换表进行了更改”(上面的代码)我希望 002.txt 中所有列中的所有值都根据转换表 ICD9toPhecode 进行更改。 txt 和 ICD10toPhecode.txt。因此,我将 awk 脚本更改为以下内容,但它不起作用,它什么也没做:
awk 'NR==1 { next } FNR==NR { a[$1]=$2; next } $1 in a { for (i = 1; i <= $NR; ++i) $i=a[$1] }1' ICD9toPhecode.txt 002.txt
awk 'NR==1 { next } FNR==NR { a[$1]=$2; next } $1 in a { for (i = 1; i <= $NR; ++i) $i=a[$1] }1' ICD10toPhecode.txt 002.txt
ICD9toPhecode.txt 和 ICD10toPhecode.txt 中的第一列是 ICD9 或 ICD10 代码,第二列是 Phecode。
002.txt 中的每一列都是 ICD9 或 ICD10 代码。
编辑:它仍然无法正常工作 如何写入文件?
这是 ICD10 代码的匿名患者数据 002.txt 样本,即 OLD_FILE
1 2 3 4 5 6 7 8
K40.9 K43.9 N20.0 N20.1 N23 N39.0 R69 Z88.1
B96.8 D12.6 E11.6 E87.6 I44.7 K40.9 K43.9 K52.9
NOT
这里是转换表(ICD10toPhecode.txt)或TABLE
icd10cm phecode
K40.9 550.1
K43.9 550.5
N20.0 594.1
N20.1 594.3
N23 594.8
N39.0 591
R69 1019
Z88.1 960.1
B96.8 041
D12.6 208
E11.6 250.2
E87.6 276.14
I44.7 426.32
K40.9 550.1
K43.9 550.5
K52.9 558
XNO 17
这就是我应该得到的(ICD10 代码转换为 Phecodes)(002_output.txt):
1 2 3 4 5 6 7 8
550.1 550.5 594.1 594.3 594.8 591 1019 960.1
041 208 250.2 276.14 426.32 550.1 550.5 558
但我在 002_output.txt 中实际得到的是 002.txt 的重复
我需要知道的是如何改变:
awk 'NR==1 { next } FNR==NR { a[$1]=$2; next } $1 in a { for (i = 1; i <= $NR; ++i) $i=a[$1] }1' ICD9toPhecode.txt 002.txt
awk 'NR==1 { next } FNR==NR { a[$1]=$2; next } $1 in a { for (i = 1; i <= $NR; ++i) $i=a[$1] }1' ICD10toPhecode.txt 002.txt
具体更改ICD10toPhecode.txt 002.txt
我需要将输出写入 002_output.txt。不可能这么简单
ICD10toPhecode.txt 002.txt > 002_output.txt
输出与 002.txt 相同的内容
TESTABLE TEST CASE(对于表格,请参阅我上面发布的带有这些名称的代码片段):
awk '
# Ignore header
NR==1{ next }
# Load first file
FNR==NR { a[$1]=$2; next }
{
# Foreach value
for (i = 1; i <= $NR; ++i) {
# if the value is in second file
if ($i in a) {
# then replace it
$i = a[$i] # NOTE - $i __not__ $1 !
}
}
# print it!
print
}
' ICD10toPhecode.txt 002.txt > 002_output.txt
基于:
awk 'NR==1 { next } FNR==NR { a[$1]=$2; next } $1 in a { $1=a[$1] }1' TABLE OLD_FILE
我很确定在我的 TESTABLE TEST CASE 中我搞砸了我的 for 循环,也许 FNR==NR { a[$1]=$2; next }
我需要将 $1 ICD 代码与 ICD10toPhecode.txt 中的 $2 Phecodes 链接起来,并在所有字段中用 Phecodes 替换 ICD 代码002.txt(多于一列)
解决方法
循环必须在条件之外。 IE。您想检查每一列,而不仅仅是 $1 in a
。考虑一种更具可读性的多行格式。
awk '
# Ignore header
NR==1{ next }
# Load first file
FNR==NR { a[$1]=$2; next }
{
# Foreach value
for (i = 1; i <= $NR; ++i) {
# if the value is in second file
if ($i in a) {
# then replace it
$i = a[$i] # NOTE - $i __not__ $1 !
}
}
# print it!
print
}
'
,
我在您的代码中看到的错误是在循环中使用 $NR
而不是 NF
,跳过第二个文件的第一行而不是按原样打印它,并且不使用制表符作为输入/输出分隔符。这显然是您需要的:
$ awk '
BEGIN { FS=OFS="\t" }
NR==FNR { map[$1]=$2; next }
FNR>1 {
for (i=1; i<=NF; i++) {
if ($i in map) {
$i = map[$i]
}
}
}
{ print }
' ICD10toPhecode.txt 002_ICD.txt
1 2 3 4 5 6 7 8
550.1 550.5 594.1 594.3 594.8 591 1019 960.1
041 208 250.2 276.14 426.32 550.1 550.5 558
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。