假设我有一个文件,我想在其中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