繁体   English   中英

AWK命令的Bash脚本

[英]Bash script for awk command

感谢您在以下方面的帮助。

我有以下文件(file.txt),大约10,000行:

ID1  ID2  0  1  0.5  0.6
ID3  ID4  0  0  0.4  0.8
ID1  ID5  0  1  0.5  0.3
ID6  ID2  1  0  0.4  0.8

文件中前两列中的ID可以出现1到10次(在第1列或第2列中)。

我要实现的目标:

我想逐行扫描此文件,如果满足以下条件,则将ID打印到不断增长的排除列表中:

我的标准如下:

If $3 > $4, print $2 (ID2) to exclusionlist.txt
If $3 < $4, print $1 (ID1) to exclusionlist.txt
If $3 = $4 and $5 < $6, print $2 (ID2) to exclusionlist.txt
If $3 = $4 and $5 > $6, print $1 (ID1) to exclusionlist.txt

因此,将其应用于第1行,考虑到$ 3 <$ 4,ID1应该在我的排除列表中。

然后,我想从排除列表中删除该ID出现的文件中的所有行。 (最多可以有10行)。

扫描完第1行后,file.txt的输出应如下所示:

ID3 ID4 0 0 0.4 0.8
ID6 ID2 1 0 0.4 0.8

和exclusionlist.txt:ID1

然后,我想再次从新的第1行开始(因为原来的第1行将被定义删除),并执行相同的过程,但是继续将新行1的排除项添加到相同的排除项列表中。

这是尝试过的。 这意味着必须将file.txt重命名为1.txt

#! bin/bash
for i in {1..5000}
do
awk 'NR==1{print;}' $i.txt
awk '{if ($3>$4 || $3==$4 && $5<$6) print $2;}' $i.txt >      exclusionlist_$i.txt
awk '{if ($3>$4 || $3==$4 && $5>$6) print $1;}' $i.txt >>    exclusionlist_$i.txt
grep -v -f exclusionlist_$i.txt $i.txt > $((i+1)).txt
rm $i.txt
done

由于我的脚本技巧不佳,我必须:(1)在每个循环后重命名我的文件,以使其能够连续执行,并且(2)最后在每个循环中都有一个新的排除列表,而不是单个'master排除列表-我可以在最后轻松地将它们全部连接起来,因此这不是主要问题,而是一团糟。

我的问题是此命令似乎扫描了整个文件(而不是仅扫描第1行),仅从第一次运行就创建了一个长排除列表。

任何帮助/建议将不胜感激。

谢谢。

GB

我不明白为什么您需要分多个步骤来执行此操作。 最终,所有行将被删除,您将只获得排除列表。

例如,这将一次完成相同的操作

$ awk '!($1 in exc) && !($2 in exc){f=($3>$4 || $3==$4 && $5<$6)?2:1; 
                                    print $f > "exclusion.list"; exc[$f]}' file

$ cat exclusion.list
ID1
ID4
ID2

由于唯一的结果是排除列表,因此您可以将其打印到标准输出

$ awk '!($1 in exc) && !($2 in exc){f=($3>$4 || $3==$4 && $5<$6)?2:1; 
                                    print $f; exc[$f]}' file  > exclusion.list          

并重定向到文件。

或者,也许我误解了这个问题。 还要注意,在您的规范中未定义$3==$4 && $5==$6条件。 也许那就是你所追求的? 如果是这样,请在这种严重情况下创建样本数据并指出需要发生的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM