簡體   English   中英

如何使用bash從文本文件中提取列

[英]how to extract columns from a text file with bash

我有一個這樣的文本文件。

 res          ABS   sum     
 SER A   1   161.15 138.3  
 CYS A   2    66.65  49.6  
 PRO A   3    21.48  15.8  
 ALA A   4    77.68  72.0  
 ILE A   5    15.70   9.0  
 HIS A   6    10.88   5.9 

我想根據最后一列(總和)的值提取第一列(res)的名稱。 如果總和 > 25 和總和 < 25,我必須打印重命名。 我怎樣才能得到這樣的輸出?

雖然您可以使用bashwhile read循環執行此操作,但使用awk更容易,而且很可能更快

awk '$5 != 25 { print $1 }'

請注意, print resnames if sum >25 and sum<25print if sum != 25相同,則您的邏輯print resnames if sum >25 and sum<25

這應該這樣做:

awk 'BEGIN{FS=OFS=" "}{if($5 != 25) print $1}' bla.txt

考慮使用awk 它是一個用於處理文本列(以及更多)的簡單工具。 這是一個簡單的awk 教程,它將為您提供概述。 如果您想在 bash 腳本中使用它,那么教程應該會有所幫助。

在命令行上運行此命令,讓您了解如何執行此操作:

> echo "SER A   1   161.15 138.3" | awk '{ if($5 > 25) print $1}'
> SER
> echo "SER A   1   161.15 138.3" | awk '{ if($5 > 140) print $1}'
> 
while read line
do 
v=($line)
sum=${v[4]}
((${sum/.*/} >= 25)) && echo ${v[0]}
done < file

您需要跳過第一行。

由於 bash 不處理浮點值,這將打印 25,它不完全大於 25。

這可以通過調用 bc 進行算術來處理。

tail -n +2 ser.dat | while read line
do  
  v=($line)
  sum=${v[4]}
  gt=$(echo "$sum > 25" | bc) && echo ${v[0]}
done

好的舊剪裁怎么樣? :)

說你想要第二列,

cat your_file.txt | sed 's, +, ,g' | cut -d" " -f 2

sed 在這個命令中做什么? cut 期望列由固定長度的字符或字符串分隔(請參閱文檔)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM