20

複数の文字で構成されるフィールドセパレータを使用できますか?引用符とコンマを含む単語を区切りたいのと同じです。

「学校」、「大学」、「市」

そこで、ここではFSを「、」に設定します。しかし、FSをそのように定義すると、面白い結果が得られます。これが私のコードの抜粋です。

awk -F\",\" '
{
for(i=1;i<=NF;i++)
  {
    if($i~"[a-z0-9],[a-z0-9]") 
    print $i
  }
}' OFS=\",\"  $* 
4

6 に答える 6

21

はい、FSは複数文字である可能性があります。あなたの例で以下のテストを参照してください:

kent$  echo '"School","College","City"'|awk -F'","|^"|"$' '{for(i=1;i<=NF;i++){if($i)print $i}}'
School
College
City
于 2011-11-24T13:38:12.117 に答える
12

ここで話題になっているのは、フィールドセパレーターは複数のキャラクターであるだけでなく、実際には本格的な正規表現である可能性があるということです。

つまり、XMLフラグメントからヘッダーと周囲のタグを取り除きます。タグは整形式ですが、異なることに注意してください。

bash-3.2$ more xml_example 
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.google.com/schemas/sitemap/0.84"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84
                  http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">
<url>
<loc>http://www.foo.com/about.html</loc>
<lastmod>2006-05-15T13:43:37Z</lastmod>
<priority>0.5000</priority>
</url>
<url>
<loc>http://www.foo.com/articles/articles.html</loc>
<lastmod>2006-06-20T23:03:36Z</lastmod>
<priority>0.5000</priority>
</url>

次に、awkスクリプトを適用して、フィールド区切り文字として正規表現を使用して、中央のフィールドを出力します。

bash-3.2$ awk -F"<(/?)[a-z]+>" '{print $2}' <xml_example




http://www.foo.com/about.html
2006-05-15T13:43:37Z
0.5000


http://www.foo.com/articles/articles.html
2006-06-20T23:03:36Z
0.5000

bash-3.2$

空白行は、タグがその行の唯一のものであった場所からのものであるため、印刷する$2はありません。これは、複数の文字を含む固定パターンだけでなく、フィールド区切り文字でも正規表現の全機能を使用できることを意味するため、実際には非常に強力です。

于 2012-02-08T11:01:48.950 に答える
7

試す

awk 'BEGIN{FS="[|,:]"}{print $1}' youFile
于 2013-04-02T18:23:50.833 に答える
3

GNU awk 4を使用すると、区切り文字と引用符が埋め込まれた*CSV*でも簡単に解析できます。

% cat infile 
"School",College: "My College","City, I"

% awk '{    
  for (i = 0; ++i <= NF;)
    print i, substr($i, 1, 1) == "\042" ?
      substr($i, 2, length($i) - 2) : $i
  }' FPAT='([^,]+)|(\"[^\"]+\")' infile  
1 School
2 College: "My College"
3 City, I
于 2011-11-24T14:20:23.060 に答える
3

はい、-Fその値は正規表現である可能性があるため、引数に複数の文字を使用できます。たとえば、次のようなことができます。

echo "hello:::my:::friend" | gawk -F':::' '{print $3}'

これは戻りfriendます。

および(GNU awk)の引数としての正規表現のサポートは-F、オリジナルではサポートされていません。Solarisではこの区別は重要ですが、Linuxでは事実上へのリンクであるため重要ではありません。したがって、awkを呼び出すのがベストプラクティスだと思います。そうすれば、プラットフォーム間で機能するからです。nawkgawkawkawkgawkgawk

于 2013-08-30T15:01:07.043 に答える
-1

awkを使用して複数の文字で区切り、正確に「、」で区切るには、文字の前に\\を追加します。

echo '"School","College","City"'|awk -F'\\\\"\\\\,\\\\"' '{for(i=1;i<=NF;i++){if($i)print $i}}'

https://es.stackoverflow.com/questions/422811/unix-awk-separaci%c3%b3n-de-campos-por-grupo-de-caracteres/423081#423081

于 2021-01-24T17:02:21.853 に答える