【问题标题】:Conversion table replace all elements in other file转换表替换其他文件中的所有元素
【发布时间】: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.txtTABLE 还是 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 &lt;= $NR; ++i) $i=a[$1] }1' ICD10toPhecode.txt 002_ICD.txt,但我需要将输出写入002_output.txt。不可能像ICD10toPhecode.txt 002_ICD.txt &gt; 002_output.txt那么简单,输出和002_ICD.txt一样的东西

标签: bash awk sed large-data


【解决方案1】:

我在您的代码中看到的错误是在您的循环中使用$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

【讨论】:

    【解决方案2】:

    循环必须在条件之外。 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
       }
    '
    

    【讨论】:

    • 它仍然什么也没做。如何写入文件?这里是 002.txt 样本 1 2 3 4 5 6 7 8 K40.9 K43.9 N20.0 N20.1 N23 N39.0 R69 Z88.1 这应该变成 1 2 3 4 5 6 7 8 550.1 550.5 594.1 594.3 594.8 591 1019 960.1 但我得到的是没有变化:1 2 3 4 5 6 7 8 K40.9 K43.9 N20.0 N20.1 N2.3 N39.0 R6.9 Z88.1
    • 编辑您的问题并在那里发布示例输入和预期输出。注释不保留行。
    • 好的,我看到了编辑:
    猜你喜欢
    • 2018-05-07
    • 2020-03-29
    • 2021-01-13
    • 1970-01-01
    • 2016-01-17
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多