
awk
元のファイルを混乱させることなく、手順の最初の列に従って複数のコマンドを同時に印刷したいファイルがあるとします。これは、2つの別々の印刷で発生するため、次のようになります。
文書:
End 1st 2nd 3rd
Fin 1st 2nd 3rd
次のコマンドを1行にまとめたいです。
awk '$1 ~ /^E/ {print $2}'
awk '$1 ~ /^F/ {print $3}'
次の出力を取得します。
End 1st
Fin 2nd
編集する 「元のファイルを台無しにする」ということは次のとおりです。
ファイル1:
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
2つの別々の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