Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 一个筛选条件,两个文件_File_Unix_Awk_Data Cleaning - Fatal编程技术网

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”}