45

このデータファイルがあるとします。

john 32 maketing executive
jack 41 chief technical officer
jim  27 developer
dela 33 assistant risk management officer

を使って印刷したいawk

john maketing executive
jack chief technical officer
jim  developer
dela assistant risk management officer

を使用して実行できることを知っていますfor

awk '{printf $1;  for(i=3;i<=NF;i++){printf " %s", $i} printf "\n"}' < file

問題は、長くて複雑に見えることです。

残りのフィールドを印刷する他の簡単な方法はありますか。

4

7 に答える 7

9

デフォルトの FS を使用する場合、gensub() の GNU awk で確実に:

$ gawk -v delNr=2 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john maketing executive
jack chief technical officer
jim  developer
dela assistant risk management officer

他の awks では、gensub() の代わりに match() と substr() を使用する必要があります。上記の変数 delNr は、削除するフィールドを awk に伝えることに注意してください。

$ gawk -v delNr=3 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john 32 executive
jack 41 technical officer
jim  27
dela 33 risk management officer

こんなことしないで:

awk '{sub($2 OFS, "")}1'

$2 にある同じテキストが $1 の末尾にある可能性があるため、および/または $2 に RE メタ文字が含まれている可能性があるため、間違った文字列をそのように削除する可能性が非常に高くなります。

こんなことしないで:

awk '{$2=""}1' file

FS を追加し、フィールド間の他のすべての連続する空白をそれぞれ 1 つの空白文字に圧縮するためです。

こんなことしないで:

awk '{$2="";sub("  "," ")}1' file

上記のスペース圧縮の問題があり、単一の空白のハードコードされた FS に依存しているため (デフォルトですが、それほど悪くはないかもしれません)、さらに重要なことに、$1 の前にスペースがあった場合、代わりにそれらの 1 つを削除します。 $1 と $2 の間に追加するスペース。

言及する価値のある最後の 1 つのことは、gawk の最近のバージョンには、split() のように機能する patsplit() という名前の新しい関数があることですが、フィールドの配列を作成することに加えて、フィールド間のスペースの配列も作成します。つまり、配列内でフィールドとその間のスペースを操作できるため、フィールドを操作する場合に OFS を使用して awk がレコードを再コンパイルすることを心配する必要はありません。次に、配列から必要なフィールドを印刷するだけです。詳細については、 http: //www.gnu.org/software/gawk/manual/gawk.html#String-Functions の patsplit() を参照してください。

于 2013-08-27T12:11:13.940 に答える
3

もう 1 つの方法は、sed を使用して最初の数字とスペースの一致を置き換えることです。

sed 's|[0-9]\+\s\+||' file

于 2013-08-27T06:41:20.937 に答える
0

それを使用するアプローチは、状態の変更awkを必要としないか、gawkまたは任意です。

awk '{print $1 " " substr($0, index($0, $3));}' datafile

UPD

少し長い解決策ですが、$1 または $2 に $3 が含まれている場合に対応します。

awk '{print $1 " " substr($0, length($1 $2) + 1);}' data

または、カスタム フィールド セパレータがある場合はさらに堅牢になります。

awk '{print $1 " " substr($0, length($1 FS $2 FS) + 1);}' data
于 2020-10-17T06:27:20.817 に答える