bash-用空格替换空字段。用管道声明

时间:2015-02-18 17:56:15

标签: bash awk sed

我正在循环遍历文件列表,而对于每个文件,我都会扫描特定的内容。

    # create .fus file
    grep DIF $file | awk '{
            if ( $7 != $13 )
                    print $4, "\t", $5, "\t", $20, "\t", $10, "\t", $11, "\t", $22, "\t", "Null";
    }' > $file_name.fus

    # create .inv_fus file
    grep DIF $file | awk '{
            if ( $7 == $13 )
                    print $4, "\t", $5, "\t", $20, "\t", $10, "\t", $11, "\t", $22, "\t", "Null";
    }' > $file_name.inv_fus

    # create .del file
    echo -e '1\t1\t1\t1' > ${file_name}.del
    echo -e '1\t1\t1\t3' >> ${file_name}.del
    grep DEL ${file} | awk '{print $4, "\t", $5, "\t", $12, "\t", "2"}' >> ${file_name}.del

第一个awk检查第7列和第13列的值是否不同,如果是,则写入文件。 第二个awk检查hte值是否相同,如果是,则写入文件。第三个创建一个文件,其中2行始终相同,其余的行由包含'DEL'的行填充。

我用来生成绘图的输出文件,但由于某些字段为空,因此失败。我怎样才能更改我的代码(我猜awk语句?),以便检查空字段(第4,5,20,10,11和22列)并用空格替换空列'。' ?

2 个答案:

答案 0 :(得分:0)

让我们从清理脚本开始吧。用一个简单的awk命令替换整个东西:

awk -v file_name="$file_name" '
BEGIN {OFS="\t"; print 1, 1, 1, 1 ORS 1, 1, 1, 3 > (file_name ".del")}
/DIF/ {print $4, $5, $20, $10, $11, $22, "Null" > (file_name "." ($7==$13?"inv_":"") "fus")}
/DEL/ {print $4, $5, $12, 2 > (file_name ".del")}
' "$file"

现在,使用示例输入和预期输出更新您的问题,捕获您还需要做的其他事情。

答案 1 :(得分:0)

就像其他回复所说的那样,这里可能会发生很多简化,但如果不知道输入或预期输出,很难评论哪些变化会有所帮助。

无论如何,问题似乎归结为用输出中的点替换空字段以进行某些处理。在awk脚本中添加这样的函数似乎可以解决问题:

function clean() {
         for(i = 1; i <= NF; i++) { if($i==""){$i="."}; }
        }

例如,在test.txt中给出此输入:

a1,a2,a3,a4
b1,,b3,b4
,,c3,
d1,d2,d3,

运行以下awk会导致空字段为句点。

awk -F',' 'function clean() {
           for(i = 1; i <= NF; i++) { if($i==""){$i="."}; }
           }
          BEGIN {OFS=","}
          {clean(); print;}' test.txt

示例输出:

a1,a2,a3,a4
b1,.,b3,b4
.,.,c3,.
d1,d2,d3,.