AWKを使って次の問題を解決したいと思います。
sedやPerlのような言語を使って他のソリューションを実装することができれば、それにも感謝します。
入力は次のとおりです。
U,N,UNIX,000,A,5
N,P,SHELL,111,B,6
I,M,UNIX,222,C,7
X,Y,BASH,333,D,8
P,R,SCRIPT,444,E,9
私が望む出力は次のとおりです。
U,N,,,A,5
N,P,,,B,6
I,M,,,C,7
X,Y,,,D,8
P,R,,,E,9
また注:1行あたりのフィールドの総数がわかりません。フィールド3と4は空にしておく必要があることだけを知っています。
ベストアンサー1
コマンドからnからmまでのすべてのフィールドを比例的に空にするには、awk
値をハードコーディングしないでください。 「for」ループを使用する必要があります。
awk 'BEGIN { FS = ","; OFS = ","} {for (i = 3; i <= 4; i++) { $i = "" }; print}' inputfile
他の範囲を消去したい場合は、上記のコードで「3」と「4」の値を調整してください。
説明する:
BEGIN { ... }
ブロックは、ファイル内のすべての行を表示する前に処理されます。
OFS
出力フィールド区切り文字を設定し、入力フィールド区切りFS
文字を設定します。私たちはそれらがカンマになりたいのです。
ループはfor
C構文と同じです。この場合は、3と4に対して次のことを行います{ code block }
。i
$i
これはシェル構文とはまったく異なることに言及する価値があります。シェルスクリプトで$
変数値を拡張するには、変数名の前にプレフィックスを付ける必要があります。 in.inawk
自体はその値(この場合は3または4)にawk
展開され、その後に数値表現が続きます。i
$
大地その番号の位置から。したがって、2番目のフィールドは空の文字列に$i = ""
設定されます。i
その後、print
引数のないコマンドはデフォルトで行全体を印刷します。デフォルトでは、前のコマンドで区切られた行と前のコマンドで変更された行のすべてのフィールドがインポートされ、すべて印刷され、改行文字で区切られ、最後にFS
改行文字が付けられます。OFS
対応するより短いコマンド:
上記のコマンドがスクリプトに含まれている場合は、最も明確で拡張しやすいコマンドだと思います。何をしているのかとても明確で読みやすいです。また、通話を使用または切り替えるときにawk
自動的に実行できない操作は、変更なしでスタンドアロンスクリプトに分割できます。 (もちろんこれが使わないべき理由ではありません。注意するだけです。)-v
-F
awk
特にワンタイム使用の場合は、以下を使用します。
awk -F, -v OFS=, '{for (i = 3; i <= 4; i++) { $i = "" }; print}' inputfile
スイッチ設定-F
の値ですFS
。このスイッチを使用すると、コマンドラインで変数の値を設定できます-v
。awk
より一般的には、このスイッチはシェル変数をawk変数として渡し、コマンドラインオプションを使用してスクリプトファイルから抽出されたスタンドアロンスクリプトの実行時の動作を変更するのに役立ち-v
ます。-v myawkvar="$myshellvar"
awk
-f scriptname