按照第一列说明打印选择性字段

按照第一列说明打印选择性字段

假设我有一个文件,我想在其中awk按照第一列指令同时打印不同的命令,而不会弄乱原始文件(因为两次单独的打印都会发生这种情况):

文件:

End 1st 2nd 3rd
Fin 1st 2nd 3rd

我想将以下命令组合成一行:

awk '$1 ~ /^E/ {print $2}'
awk '$1 ~ /^F/ {print $3}'

获得以下输出:

End 1st
Fin 2nd

编辑 我所说的“弄乱原始文件”的意思是:

文件一:

E1   NAME1 LASTNAME1
FA   22   1992         #age, year
FC   UK   London       #country, city
FJ   IT   HP           #job, company
E2   NAME2 LASTNAME2
FA   25   1989        
FC   CH   Geneva      
FJ   CS   SIB    

现在,如果我运行两个单独的 awk 打印,我将无法将文件 3 中的信息与文件 2 的名称进行匹配(特别是如果字段数量^F不相同):

awk '$1 ~ /^E/ {print $2}' File 1 > File 2

输出(文件 2):

NAME1
NAME2

awk '$1 ~ /^F/ {print $3}' File 1 > File 3

输出(文件 3):

1992        
London       
HP           
1989        
Geneva      
SIB  

但是,如果我加入他们(按照答案中的建议),我将能够拥有这样的东西:

预期输出:

NAME1
1992        
London       
HP  
NAME2
1989        
Geneva      
SIB  

答案1

awk '$1 ~ /^E|^F/ {if ($1 == "End") print $1" "$2; if ($1 == "Fin") print $1" "$3}'

或者

awk '/^End/{print $1" "$2}/^Fin/{print $1" "$3}'

(谢谢吉德

应该管用。

答案2

这应该有效

awk '/^F/{$2=$3}NF=(NF-2)' file

如果你也想匹配E(如果文件中有其他东西)

awk 'a=/^F/{$2=$3}{x=/^E/}(x||a)&&NF=(NF-2)' file

答案3

尝试:

awk '$1 ~ /^E/ {print $1,$2;next};$1 ~ /^F/ {print $1,$3}' file

答案4

对于预期输出,

awk '/^E/{$0=$2} /^F/{$0=$3}1' file

如果您也想打印第一个字段,

awk '/^E/{$0=$1 FS $2} /^F/{$0=$1 FS $3}1' file

相关内容