web-dev-qa-db-ja.com

awkのフィールドセパレータとして ":"を使うにはどうすればいいですか?

次のコマンドがあるとします。

echo "1: " | awk '/1/ -F ":" {print $1}'

なぜawkは出力しますか:

1: 
212
user173446

"-F"はawk構文ではないコマンドライン引数です。

 echo "1: " | awk -F  ":" '/1/ {print $1}'
332
Jürgen Hötzel

プログラム的に実行したい場合は、FS変数を使用できます。

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

BEGINループではなくメインループでそれを変更すると、現在の行はすでに読み込まれているため、読み込んだnext行に影響します。分割されました。

55

:を区切り文字として設定する方法は複数あります。

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

これらはすべて等価であり、サンプル入力 "1:2:3"に対しては、1を返します。

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
23
fedorqui

-Fawk自体への引数です。

$echo "1: " | awk -F":" '/1/ {print $1}'
1
12
danben

AWKはテキストインタープリターとして機能しますドキュメント全体で行単位で移動しますおよび各行でフィールド単位で移動しますしたがって、$ 1、$ 2 .. $ nは各行のフィールドへの参照です( $ 1は最初のフィールド、$ 2は2番目のフィールドなどです...)。コマンドラインの下、または「FS = ...」で囲まれた2つの括弧内に「-F」スイッチを使用して、フィールド区切り文字を定義できます。 「JUERGEN」の答えを考えてみましょう:

echo "1: " | awk -F  ":" '/1/ {print $1}'

フィールド境界の上は「:」で設定されるため、「1」である2つのフィールド$ 1とISの空のスペースがあります。その後、フィルターに指示する正規表現「/ 1 /」が来ます。インタプリタがそのような式を含む行でつまずいたときにのみ最初のフィールドを出力する(i mean 1); 「echo」コマンドの出力は「1」を含む1行なので、フィルターは機能します...

次の例を扱う場合:

echo "1: " | awk '/1/ -F ":" {print $1}'

構文は乱雑で、インタープリターはパーツF ":"を無視することを選択しましたであり、空のスペースであるデフォルトのフィールドスプリッターに切り替え、最初のフィールドとして "1:"を出力します。 2番目のフィールド!

JUERGENの答えには、適切な構文が含まれています...

5
jihed gasmi

正規表現をフィールドの区切り文字として使用することもできます。次の例では、正規表現を使用して "10"を区切り文字として設定することで "bar"を印刷します。

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'
4
Zlemini

これだけ書く必要はありません。 awkコマンドに-Fオプションを付けて目的のフィールド区切り文字を入力し、印刷したい列番号を前述のフィールド区切り文字に従って分離するだけです。

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1
3
Bhavuk Taneja

またはあなたが使用することができます:

echo "1: " | awk  '/1/{print $1-":"}' 

これは本当に面白い方程式です。

2
Vonton