File 一个筛选条件,两个文件
我有一个像这样的文件File 一个筛选条件,两个文件,file,unix,awk,data-cleaning,File,Unix,Awk,Data Cleaning,我有一个像这样的文件 VAR1 VAR2 VAR3 VAR4 ID1 foo 0.1 0.1 ID2 foo 1 1 ID3 foo foo . ID4 foo foo foo ID5 foo . 1 ID6 foo -0.1 -0.1 ID7 foo -1 -1 ID8 foo 5e-0
VAR1 VAR2 VAR3 VAR4
ID1 foo 0.1 0.1
ID2 foo 1 1
ID3 foo foo .
ID4 foo foo foo
ID5 foo . 1
ID6 foo -0.1 -0.1
ID7 foo -1 -1
ID8 foo 5e-08 5e-08
我想根据一组连续的标准筛选出行(例如,首先从第3列中删除所有非数字项,然后从第4列中删除所有负数项),但我想保存所有符合这些中间标准的行。也就是说,我的最终输出应该是1)一个包含在第一步中删除的所有行的文件,2)一个包含在下一步中删除的所有行的文件,以及3)一个包含在筛选过程中幸存下来的所有行的文件
到目前为止,我得到的是:
awk '$3!=$3*1 {print}' < file.txt > REMOVED_COL_3.txt
if [[ $( find REMOVED_COL_3.txt -type f -size +0c 2>/dev/null ) ]]
then
awk '$3==$3*1' < file.txt > tmp.txt && mv tmp.txt file.txt
fi
awk '$4<0 {print}' < file.txt > REMOVED_COL_4.txt
if [[ $( find REMOVED_COL_4.txt -type f -size +0c 2>/dev/null ) ]]
then
awk '$4>=0 {print}' < file.txt > tmp.txt && mv tmp.txt file.txt
fi
awk'$3=$3*1{print}'已删除\u COL\u 3.txt
如果[$(查找已删除的\u COL_3.txt-类型f-大小+0c 2>/dev/null)]]
然后
awk'$3==$3*1'tmp.txt&&mv tmp.txt file.txt
fi
awk'$4=0{print}'tmp.txt&&mv tmp.txt file.txt
fi
这是可行的,但在我的真实数据集中需要很多时间(预过滤了约1300万行)
是否可以一次awk
,将符合条件的行保存在一个文件中,而不符合条件的行保存在另一个文件中?还是别的什么
编辑:
我忘记了文件中的头这在单个awk脚本中是非常可能的。您可以在
awk
中使用if/else if/else
,也可以将单个print
语句重定向到不同的文件:
awk '{ if ($3!=$3*1) {print $0 > "REMOVED_COL_3.txt"} else if ($4<0) {print $0 > "REMOVED_COL_4.txt"} else {print $0 > "everythingelse_out.txt"}}' file.txt && mv -f everythingelse_out.txt file.txt
awk'{if($3!=$3*1){print$0>“REMOVED\u COL\u 3.txt”}else if($4“REMOVED\u COL\u 4.txt”}else{print$0>“everythingelse\u out.txt”}file.txt&&mv-f everythingelse\u out.txt file.txt
这在单个awk脚本中是非常可能的。您可以在awk
中使用if/else if/else
,也可以将单个print
语句重定向到不同的文件:
awk '{ if ($3!=$3*1) {print $0 > "REMOVED_COL_3.txt"} else if ($4<0) {print $0 > "REMOVED_COL_4.txt"} else {print $0 > "everythingelse_out.txt"}}' file.txt && mv -f everythingelse_out.txt file.txt
awk'{if($3!=$3*1){print$0>“REMOVED\u COL\u 3.txt”}else if($4“REMOVED\u COL\u 4.txt”}else{print$0>“everythingelse\u out.txt”}file.txt&&mv-f everythingelse\u out.txt file.txt
awk'
NR==1{
拆分(“已删除的\u COL_3.txt已删除的\u COL_4.txt tmp.txt”,outfiles)
用于(输出文件中的输出编号){
打印>输出文件[outnr]
}
下一个
}
{
如果($3!=$3+0){outnr=1}
如果($4<0){outnr=2}
else{outnr=3}
打印>输出文件[outnr]
}
'file.txt&&
mv tmp.txt file.txt
我使用$3+0
而不是$3*1
将字符串转换为数字,因为加法通常比乘法快一点,这是执行该操作的更常见方式,请参阅:要强制字符串转换为数字,请将该字符串加零。
awk
NR==1{
拆分(“已删除的\u COL_3.txt已删除的\u COL_4.txt tmp.txt”,outfiles)
用于(输出文件中的输出编号){
打印>输出文件[outnr]
}
下一个
}
{
如果($3!=$3+0){outnr=1}
如果($4<0){outnr=2}
else{outnr=3}
打印>输出文件[outnr]
}
'file.txt&&
mv tmp.txt file.txt
我使用
$3+0
而不是$3*1
将字符串转换为数字,因为加法通常比乘法快一点,这是执行该操作的更常见方式,请参见:要强制将字符串转换为数字,请在该字符串中添加零。
谢谢,我忘记了ini的标题tial文件。是否也可以将其保存到所有输出文件?谢谢,我忘记了初始文件的标题。是否也可以将其保存到所有输出文件?谢谢,我忘记了初始文件的标题。是否也可以将其保存到所有输出文件?是的。您可以添加(开始时)NR==1{print$0>“REMOVED\u COL\u 3.txt”;print$0>“REMOVED\u COL\u 4.txt”;print$0>“everythingels\u out.txt”}
谢谢,我忘记了我初始文件的头。是否也可以将其保存到所有输出文件中?是的。您可以(开始时)添加NR==1{print$0>“REMOVED\u COL u\u\u 3.txt”;print$0>“已删除”\u COL\u 4.txt;“打印$0>“everythingelse\u out.txt”}