在bash中具有条件的列中的单独值

时间:2016-10-14 00:17:56

标签: bash awk grep conditional-statements

我有一个类似下面的txt文件

008 750 16.3763  1
028 572 -91.1915  2
031 421 -19.2564  1
113 265 -5.05956  1
147 099 38.017  1
154 161 -4.43984  1
170 101 28.2171  1
179 728 -31.2691  2

我想根据第四列中的值分隔第三列: 如果第四列为1,则将另外两列插入“(第三列的值)NA”,如果为2,则将其设为“NA(第三列的值)”,然后删除第三列和第四列。我会得到

008 750 16.3763    NA
028 572 NA        -91.1915  
031 421 -19.2564   NA
113 265 -5.05956   NA
147 099 38.017     NA
154 161 -4.43984   NA
170 101 28.2171    NA
179 728 NA        -31.2691 

有人能告诉我如何在bash命令中实现这一点吗?

我认为快速的方法是用NA替换第四列,如果值为1.如果是2,则切换第三列和第四列,然后用NA替换2。

awk '{OFS="\t";if($i==1) $i="NA"; print}' *.txt

但我不知道如何切换两列的值。

谢谢! :)

2 个答案:

答案 0 :(得分:0)

  

"如果值为1则将第四列替换为NA,如果为2,   切换第三和第四列,然后用NA"

替换2

试试这个:

$4==1{$4="NA"}

如何运作

  • 1

    如果第四列是NA,那么我们将其设置为$4==2{$4=$3; $3="NA"}

  • 2

    如果第四列是NA,那么我们将第四列等于第三列,然后用1替换第三列。

  • {print}

    这是用于打印线的awk简洁速记。如果你不喜欢神秘,你可以改用OFS='\t'

  • awk -F'\t' '$4==1{$4="NA"} $4==2{$4=$3; $3="NA"} 1' OFS='\t' 1.txt

    这会将输出中的字段分隔符设置为选项卡。

如果输入上的字段分隔符是选项卡,那么您可能还需要指定:

column -t

改进格式

上面使用tab作为字段分隔符,这意味着列不允许很好地排列。要解决此问题,我们可以使用$ awk '$4==1{$4="NA"} $4==2{$4=$3; $3="NA"} 1' OFS='\t' 1.txt | column -t 008 750 16.3763 NA 028 572 NA -91.1915 031 421 -19.2564 NA 113 265 -5.05956 NA 147 099 38.017 NA 154 161 -4.43984 NA 170 101 28.2171 NA 179 728 NA -31.2691

$prod =  mysql_query("SELECT * FROM tblproduct WHERE id = ".$_POST['pid'],$db_con); //$db_con must be your database connection

if(!$prod) { die("Database query failed: " . mysql_error()); } //always check if your query is properly done.

$pname = ""; 

while ($row = mysql_fetch_array($prod)) { 
$pname = $row["name"]; } 

答案 1 :(得分:0)

$ awk '{ if ($4==1) {$4="NA"} else {$4=$3; $3="NA"} }1' file | column -t
008  750  16.3763   NA
028  572  NA        -91.1915
031  421  -19.2564  NA
113  265  -5.05956  NA
147  099  38.017    NA
154  161  -4.43984  NA
170  101  28.2171   NA
179  728  NA        -31.2691