0

Unixコマンドは初めてです。100 個のフィールドを持つ server.txt という名前のファイルがあり、ファイルの最初の行はヘッダーです。

99 と 100 のフィールドだけを見てみたいと思います。

フィールド 99 は単なる数値で、フィールド 100 は文字列です。

スペースである各フィールドの区切り文字。

私の目標は、grep と正規表現によって文字列 (field100) 内のすべてのトークンを抽出し、文字列から抽出されたすべてのトークンで field99 を出力し、レコードの最初の 1000 行をスキップすることです。

----server.txt--
... ...   ,field99,field100
... ...    5,"hi are"
... ...    3,"how is"

-----output.txt
header1,header2
5,hi
5,are
3,how
3,is

だから私はいくつかのアイデアを持っていますが、すべてのスクリプトを組み合わせる方法がわかりません

これが私の考えの一部です:

sed 1000d server.txt cut -f99,100  -d' ' >output.txt
grep | /[A-Za-z]+/| 
4

1 に答える 1

1

の仕事のように聞こえawkます。

awk -F, 'NR <= 1000 { next; }
  { gsub(/^\"|\"$/, "", $100); split($100, a, / /);
    for (v=1; v<=length(a); ++v) print $99, a[v]; }' server.txt >output.txt

プログラムの一般的な形式awkは、一連のcondition { action }式です。最初の行の条件NR <= 1000whereNRは現在の行番号です。条件が真の場合、nextアクションは次の入力行にスキップします。それ以外の場合は、条件を持たない次の式に進みます。したがって、ここに到達するすべての入力行に対して無条件です。最初に 100 番目のフィールド値を囲む二重引用符を削除してから、それをスペースで分割して配列に入れaます。次にfor、ループはこの配列をループし、配列の 99 番目のフィールド値と配列の 4v番目の要素をv=1出力します。

入力ファイル形式はやや面倒です。gsubとものはsplit、もう少しまともな入力形式で回避できます。を初めて使用する場合awkは、おそらくチュートリアルを探す必要があります。

スクリプト言語を 1 つだけ学びたい場合は、Perl または Python をお勧めawkしますが、それは計画と方向性によって異なります。

于 2012-09-06T17:31:49.987 に答える