2016-05-26 11 views
-1

このようなawkコマンドを使用して自分のデータファイルの1つを操作する必要があります。どうすればawkを使ってこれを達成できますか?どんな入力も感謝します。ありがとうございました。番号に基づいてフィールドの1つに行番号を割り当てます。各行のフィールドの数

1) Get the no. of fields for each row. 
    (a) If the count_of_fields = 'x' then assign a value to nth field in each row. 

入力: -

1,x,A,B 
2,A,B,C 
3,x,C,D 
4,D,E,F,G 
5,x,E,F 

**

出力

**: -

1,1,A,B 
2,A,B,C 
3,3,C,D 
4,D,E,F,G 
5,5,E,F 

x- is the 2nd column where I would like to assign NR when NF=4 
n - This is the 2nd column. 
+0

例をより明確にしてください、入力中に 'X'と 'N'は何ですか?あなたは今まで何を試しましたか? – 123

+0

あなたが入力したサンプル入出力について考えてみてください。フィールドがxでNFが4のときにのみ何かをする必要があるようですが、フィールドがxであるたびにサンプル入力を投稿するのはなぜですか?** NF **は常に** 4ですか?誰かが書いたように、NFが4のときにxを変更し、投稿されたサンプル入力に対してテストするというあなたの要求を完全に無視するソリューションを書くことができます。また、あなたは**常に**私はその要件も無視することができるように変更したいフィールドにxを持っています。これはひどい例ですが、あなたのユースケースをカバーするほどではありません! –

+1

たとえば、awk '{sub(/ x /、NR)} 1'ファイルのソリューションを投稿し、投稿されたサンプル入力に対して実行すると、投稿された期待出力が生成されます。その完全に間違ったソリューションはもちろんですが、サンプル入力/出力にはどのような価値がありましたか?なし。変更が必要な変更を避けることは常に容易であり、変更したくない変更を避けるのはずっと難しいので、サンプルの入出力を作成するときに、実際には難しいと思われるケースを思いついています。あなたの最も基本的な要件をカバーするケース。 –

答えて

2

あなたの質問は完全ではありません明らかです。
awkでは、組み込み変数NFNRは、それぞれの行のフィールド数とレコード/行番号をそれぞれ表します。与えられた入力から所望の出力を得るために

、私は次の操作を行います:

1,1,A,B 
2,A,B,C 
3,3,C,D 
4,D,E,F,G 
5,5,E,F 

更新:

awk 'BEGIN{OFS=FS=","}$2=="x"{$2=NR}1' test.txt 

をこれは、行番号で2番目の列に各xを置き換えます。フィールド数が4の場合、2列目の内容をNRに置き換えたい場合:

awk 'BEGIN{OFS=FS=","}NF==4{$2=NR}1' test.txt 

出力:

1,1,A,B 
2,2,B,C 
3,3,C,D 
4,D,E,F,G 
5,5,E,F 
2

次のことを試してみてください。

awk -v count=4 -v ndx=2 'BEGIN { FS=OFS="," } NF==count { $ndx = NR } 1' file 

元の値がxであれば第二フィールドは、(あなたのサンプル出力と一致するように)交換する必要があります場合は、次の

  • -v count=4 -v ndx=2

    は、 dフィールドの数は、awkの変数countawkのスクリプトになり、ターゲットフィールドのインデックスは変数ndxとなります。実行

  • BEGIN { FS=OFS="," }

    のみ一旦、スクリプトの残りの部分の前に、入力フィールドセパレータ(FS)と,から出力フィールドセパレータの両方を設定するようにawk改入力にそのフィールドをカンマで区切り、フィールド値を変更した後に行を再構築するときに区切り記号としてカンマを使用します。 ありがとう、Ed Morton

  • NF==count

    count変数に対してフィールドカウント(NF)をテストし、値が等しい場合にのみ、次のアクション({...})を実行するパターンです。

  • { $ndx = NR }

    効果新しいフィールド値と入力ラインを再構築、インデックスndxとフィールドへの電流(1系)行インデックス(NR)を割り当てます。

  • 1

    単にプリント(潜在的に修飾された)入力ラインに共通の省略形です。(1{ print }を効果的に等価である:パターン1は常にtrueに評価され、それが関連付けられているアクションを持っていないので、デフォルトのアクションは、単にラインを印刷することである、で蹴る。)

関連する問題