【发布时间】:2021-08-24 15:23:00
【问题描述】:
我正在尝试将制表符分隔文件中的所有 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(有关表格,请参见我在上面发布的带有这些名称的代码 sn-ps):
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 } 我需要在 ICD10toPhecode.txt 中将 1 美元的 ICD 代码与 2 美元的 Phecode 链接起来,并用 002 中所有字段中的 Phecodes 替换 ICD 代码。 txt(多列)
【问题讨论】:
-
好的,我格式化了。
-
002.txt是TABLE还是OLD_FILE的示例?无论它是什么 - 还向我们展示了另一个输入文件的样本(ICD9toPhecode.txt?),它将用于产生您提供的预期输出。我们需要您向我们提供清楚地表明您的要求和问题的内容,并且我们可以复制/粘贴这些内容以测试潜在的解决方案。 -
002.txt 是 OLD_FILE 而 ICD9toPhecode.txt 是 TABLE(转换表)
-
好的,然后更新您的问题以包含应用于 002.txt 时会产生预期输出的 TABLE。现在您似乎正在显示一个 OLD_FILE (
Here is 002.txt sample which is OLD_FILE),但随后说它应该变成一个 TABLE (Here is what it should turn into (ICD9toPhecode.txt) or TABLE),而不是说给定一个 OLD_FILE 和一个 TABLE,输出应该是新的。尽管听起来应该非常简单,但您要尝试做什么非常不清楚。 -
我需要知道的是在
awk '之后放置什么,请参阅我的OP 中的代码块#2 现在我执行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_ICD.txt,但我需要将输出写入002_output.txt。不可能像ICD10toPhecode.txt 002_ICD.txt > 002_output.txt那么简单,输出和002_ICD.txt一样的东西
标签: bash awk sed large-data