我正在循环遍历文件列表,而对于每个文件,我都会扫描特定的内容。
# 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列)并用空格替换空列'。' ?
答案 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,.