Bash 在Unix环境中,如何用与第四列的字符串相关联的第三列的数字填充一列?

Bash 在Unix环境中,如何用与第四列的字符串相关联的第三列的数字填充一列?,bash,unix,awk,Bash,Unix,Awk,我有一个标签文件,比如 342455 94387 94387 YY1AP1 YY1AP1 141675 141675 LAMTOR2 141675 141675 141675 LAMTOR2 NRDC 352178 352178 NRDC NRDC 3

我有一个标签文件,比如

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列而不是第3列打印第4列。好的问题,请尝试下面的内容,并让我知道这是否对您有帮助,如果您不介意间距(否则我也可以修复它)

输出如下

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 -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

您能告诉我们为什么列填充不一致吗?而且,至少对我来说,哪一个字段应该归档还不清楚,你提到了字段1,但我可以看到很多字段都被填满了,请告诉我们逻辑,以便我们可以帮助你。好的。所以我只想用第三列的数字写第一列,第三列中的每个数字都与第四列中的一个字符串相关联。这样,当第三列为空时,我希望在第一列中写入与第四列关联的数字,因为在所有情况下,第四列中的字符串至少与一行第三列中的数字关联。如果第三列有数字,我的脚本只写第一列。为什么在第五行填写所有列,而不是在第七行NRDC所在的位置?第一行让我尴尬:
342455 94387 94387 YY1AP1
。为什么第一列和第三列不同?此外,所需输出中的第二行在第一列中也有编号
342455
,而根据您的逻辑,它应该有编号
94387
,因为编号
94387
与第四列中的字符串
yyy1ap1
相关联。因此,事实上,对于第一行,第二列和第三列是不同的。但这是正确的。对于某些行,第3列与第1列不同。在这种情况下,优先权在第1列。总之,有三种情况。如果第一列有一个数字,则保持不变。如果第1列为空,第3列有数字,请在第1列上打印此数字。如果第1、第2和第3列为空,则根据另一行的第4列@MiniMax在第1列打印相同的数字。在检查完文件后,我已经确认是正确的,但不能正常工作。获得的输出类似。如果第3列中有数字,请在第1列中打印相同的数字。但是,当第3列为空时,请打印第4列而不是第3列。如果您能用这些详细信息编辑您的帖子,我将尝试修复它。我已经在顶部以及两篇帖子上详细描述了您的脚本执行的输出,以及为什么不能正常工作。无论如何,感谢@RavinderSingh13一直以来的帮助和建议。怎么可能呢,它对我来说运行良好,请检查您的输入文件中是否有任何回车字符,通过执行cat-v输入文件(如果是),然后通过执行tr-d'\r'temp\u file&&mv temp\u file Input\u file删除它,让我知道它是如何运行的。我再次测试了我的脚本,它对我来说运行良好。您使用的是同一个输入文件吗?不确定什么工作正常。但是,我想生成一个输出,但我不确定如何生成,因为编写input.txt>output.txt或gawk-I inplace不起作用both@PercevalVellosilloGonzalez要将输出写入文件,请将最后一行更改为
}'input.txt input.txt>output.txt
。应该有用。谢谢你帮助@MiniMax。
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