我将非常感谢您对以下方面的帮助。
我有以下文件(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行,ID1应该在我的排除列表中,因为$ 3&lt; $ 4
然后我要删除文件中的所有行,其中显示了排除列表中的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)每个循环最后都有一个新的排除列表,而不是单个'主'排除列表 - 我可以很容易地将它们全部连接起来,所以这不是一个主要问题,而是凌乱。
我遇到的问题是这个命令似乎扫描整个文件(而不仅仅是第1行),从第一次运行开始创建一个长排除列表。
非常感谢任何帮助/建议。
谢谢。
GB
答案 0 :(得分:1)
我不明白为什么你需要分多步完成这项工作。最终,所有行都将被删除,您只会获得排除列表。
例如,这将在一次传递中执行相同的操作
$ 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
由于唯一的结果是排除列表,您可以将其打印到stdout
$ 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
条件。或许这就是你之后的事情?!如果是这样,请使用此关键案例创建样本数据,并指出需要发生的事情。