【问题标题】:How to fill a column with the numbers of third column associated to the strings of fourth column in Unix environment?如何用与 Unix 环境中第四列的字符串相关联的第三列的数字填充一列?
【发布时间】:2017-09-25 09:14:13
【问题描述】:

我有一个类似的 TAB 文件

342455  94387   94387   YY1AP1 
                        YY1AP1 
        141675  141675  LAMTOR2
141675  141675  141675  LAMTOR2
                        NRDC    
        352178  352178  NRDC   
                        NRDC       
        352178  352178  NRDC    
        352178  352178  NRDC    
                        NRDC      
                311380  MPC2
                311380  MPC2
                        MPC2

我想根据第四列用第三列的数字填写每一行的第一列。此外,那些为空的行也应填充与第四列对应的相同数字。所以,期望的输出应该是:

342455  94387   94387   YY1AP1 
342455                  YY1AP1 
141675  141675  141675  LAMTOR2
141675  141675  141675  LAMTOR2
352178                  NRDC    
352178  352178  352178  NRDC   
352178                  NRDC       
352178  352178  352178  NRDC    
352178  352178  352178  NRDC    
352178                  NRDC      
311380          311380  MPC2
311380          311380  MPC2
311380                  MPC2

以这种方式我尝试过这样做:

awk 'BEGIN { FS=OFS="\t" } {if ($1 == "") { $1 = $3 } else if ($1 ~/^[0-9]/){ $1 = $1 }} print}' "input.tsv" > "output.tsv";

不过,只有在第三列有数字时才填写第一列。我想创建一个哈希以关联第三列和第四列,然后将其关联到第一列并获得所需的输出,但是,有没有可能以更简单的方式做到这一点?提前致谢。

好的。通过您的脚本@RavinderSingh13 获得的输出类似于:

342455  94387   94387   YY1AP1
YY1AP1                  YY1AP1
141675  141675  141675  LAMTOR2
141675  141675  141675  LAMTOR2
NRDC                    NRDC
352178  352178  352178  NRDC
NRDC                    NRDC
352178  352178  352178  NRDC
352178  352178  352178  NRDC
NRDC                    NRDC
311380          311380  MPC2
311380          311380  MPC2
MCP2                    MPC2

执行我想要的相同功能,但在第一列而不是第三列打印第四列

【问题讨论】:

  • 能否请您告诉我们为什么列填充不一致?此外,至少对我来说还不清楚应该提交哪些字段,您提到了字段 1,但我可以看到很多都被填满了,请让我们知道逻辑,以便我们为您提供帮助。
  • 好的。所以我只想在第一列写第三列的数字,第三列中的每个数字都与第四列中的一个字符串相关联。这样,当第三列为空时,我想在第一列中写入与第四列相关联的数字,因为在所有情况下,第四列中的字符串至少与一行中第三列中的数字相关联。如果第三列中有数字,我的脚本只会写第一列
  • 为什么在第 5 行填充所有列,而不是在 NRDC 所在的第 7 行?
  • 第一行让我很尴尬:342455 94387 94387 YY1AP1。为什么第一列和第三列不同?此外,所需输出中的第二行在第一列中也有342455 数字,根据您的逻辑,它应该有94387,因为94387 数字与第四列中的YY1AP1 字符串相关联列。
  • 所以事实上第一行第二列和第三列是不同的。不过是对的。对于某些行,第 3 列与第 1 列不同。在这种情况下,优先级为第 1 列。概括起来就是三种情况。如果第一列有数字,则保持不变。如果第一列是空的并且第三列有一个数字,则在第一列打印这个数字。如果第 1、第 2 和第 3 列为空,则在第 1 列根据其他行 @MiniMax 中的第 4 列打印相同的数字。检查文件后我已经验证是正确的

标签: bash unix awk


【解决方案1】:

试试这个:

awk -F'\t' '
FNR == NR {
    if(!arr[$4])
        arr[$4] = ($1) ? $1 : $3;
}
FNR != NR {
    if(!$1)
        printf "%d", arr[$4];
    print;
}' input.txt input.txt

【讨论】:

  • 工作正常。但是我想生成一个输出,但我不知道怎么做,因为写 input.txt > output.txt 或 gawk -i inplace 不能同时工作
  • @PercevalVellosilloGonzalez 要将输出写入文件,请将最后一行更改为 }' input.txt input.txt > output.txt。应该工作。
  • 感谢@MiniMax 的帮助。
【解决方案2】:

++ve 是个好问题,请您尝试关注并告诉我这是否对您有帮助,如果您不关心间距(否则我也可以修复它)。

awk '
FNR==NR{
  val=$0;
  if(!/^ +[a-zA-Z]+/){
    sub(/^ +/,"",val);
    num=split(val, a," ");
    b[$NF]=a[1]
};
  if(/^[0-9]+/){
    b[$NF]=$1
};
  next
}
/^[0-9]+/{
  print;
  next
}
!/^[0-9]+/{
  print b[$NF],$0
}
'   Input_file  Input_file

输出如下。

342455  94387   94387   YY1AP1
342455                         YY1AP1
141675         141675  141675  LAMTOR2
141675  141675  141675  LAMTOR2
352178                         NRDC
352178         352178  352178  NRDC
352178                         NRDC
352178         352178  352178  NRDC
352178         352178  352178  NRDC
352178                         NRDC
311380                 311380  MPC2
311380                 311380  MPC2
311380                         MPC2

【讨论】:

  • 无法正常工作。得到的输出是相似的。当第 3 列中有数字时,在第 1 列中打印相同的数字。但是,当第 3 列为空时,打印第 4 列而不是第 3 列
  • 您能否用这些详细信息编辑您的帖子,然后我会尝试修复它。
  • 我已经在顶部以及两个帖子上更详细地写了您的脚本执行的输出以及为什么不能正常工作。无论如何感谢@RavinderSingh13 一直以来的帮助和建议
  • 怎么可能,它对我来说工作正常,您能否通过执行 cat -v Input_file 检查您的 Input_file 中是否有任何回车字符,如果是,然后通过执行 tr 将其删除 - d '\r' temp_file && mv temp_file Input_file 让我知道它是怎么回事。
  • 我再次测试了我的脚本,它对我来说运行良好。您是否使用相同的 Input_file 不确定发生了什么
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
相关资源
最近更新 更多