How to assign value at run time in AWK command












1















I am using below command to remove line feeds with in field values.This sample commmand created for file having 3 attributes.



awk -F| '{while(NF<3 && getline p)$0=$0 p}1'


My input filess having different number of attributes, so I want to parameterize number of attributes value in AWK command. I tried like below but getting error.



NoAttributes=12
awk -F| '{while(NF<$NoAttributes && getline p)$0=$0 p}1'


Error Details:




awk: Field is not correct.



The input line number is 1.



The source line number is 1.











share|improve this question





























    1















    I am using below command to remove line feeds with in field values.This sample commmand created for file having 3 attributes.



    awk -F| '{while(NF<3 && getline p)$0=$0 p}1'


    My input filess having different number of attributes, so I want to parameterize number of attributes value in AWK command. I tried like below but getting error.



    NoAttributes=12
    awk -F| '{while(NF<$NoAttributes && getline p)$0=$0 p}1'


    Error Details:




    awk: Field is not correct.



    The input line number is 1.



    The source line number is 1.











    share|improve this question



























      1












      1








      1








      I am using below command to remove line feeds with in field values.This sample commmand created for file having 3 attributes.



      awk -F| '{while(NF<3 && getline p)$0=$0 p}1'


      My input filess having different number of attributes, so I want to parameterize number of attributes value in AWK command. I tried like below but getting error.



      NoAttributes=12
      awk -F| '{while(NF<$NoAttributes && getline p)$0=$0 p}1'


      Error Details:




      awk: Field is not correct.



      The input line number is 1.



      The source line number is 1.











      share|improve this question
















      I am using below command to remove line feeds with in field values.This sample commmand created for file having 3 attributes.



      awk -F| '{while(NF<3 && getline p)$0=$0 p}1'


      My input filess having different number of attributes, so I want to parameterize number of attributes value in AWK command. I tried like below but getting error.



      NoAttributes=12
      awk -F| '{while(NF<$NoAttributes && getline p)$0=$0 p}1'


      Error Details:




      awk: Field is not correct.



      The input line number is 1.



      The source line number is 1.








      shell-script awk variable






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 26 at 12:41









      Jeff Schaller

      40.9k1056130




      40.9k1056130










      asked Jan 26 at 12:27









      chava kumarchava kumar

      183




      183






















          1 Answer
          1






          active

          oldest

          votes


















          3














          To set an awk variable on the command line, use -v variable=value:



          awk -v attrs=2 '{ ... NF < attrs && ... }'


          You may also access environment variables by using ENVIRON["variable"] in the awk code:



          export attrs=2
          awk '{ ... NF < ENVIRON["attrs"] && ... }'


          or,



          attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


          or,



          env attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


          The last two variations would not set attrs in the invoking environment, only for the awk program (and any processes it may possibly start).



          A third way is to give variable=value as a "filename" argument:



          awk '...' msg="hello" file1 file2 msg="good bye" file3 file4


          This would set the awk variable msg to the string hello before starting to process the file file1. It would retain that value until the value is change to good bye just before processing file3. Note that variables set in this way would not be available inside any BEGIN block in the awk code.



          Injecting shell variables directly into the awk code by means of a variable expansion in the string that constitutes the code is not a good way of transferring data into an awk program, and should be avoided.






          share|improve this answer

























            Your Answer








            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "106"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f496869%2fhow-to-assign-value-at-run-time-in-awk-command%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            3














            To set an awk variable on the command line, use -v variable=value:



            awk -v attrs=2 '{ ... NF < attrs && ... }'


            You may also access environment variables by using ENVIRON["variable"] in the awk code:



            export attrs=2
            awk '{ ... NF < ENVIRON["attrs"] && ... }'


            or,



            attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


            or,



            env attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


            The last two variations would not set attrs in the invoking environment, only for the awk program (and any processes it may possibly start).



            A third way is to give variable=value as a "filename" argument:



            awk '...' msg="hello" file1 file2 msg="good bye" file3 file4


            This would set the awk variable msg to the string hello before starting to process the file file1. It would retain that value until the value is change to good bye just before processing file3. Note that variables set in this way would not be available inside any BEGIN block in the awk code.



            Injecting shell variables directly into the awk code by means of a variable expansion in the string that constitutes the code is not a good way of transferring data into an awk program, and should be avoided.






            share|improve this answer






























              3














              To set an awk variable on the command line, use -v variable=value:



              awk -v attrs=2 '{ ... NF < attrs && ... }'


              You may also access environment variables by using ENVIRON["variable"] in the awk code:



              export attrs=2
              awk '{ ... NF < ENVIRON["attrs"] && ... }'


              or,



              attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


              or,



              env attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


              The last two variations would not set attrs in the invoking environment, only for the awk program (and any processes it may possibly start).



              A third way is to give variable=value as a "filename" argument:



              awk '...' msg="hello" file1 file2 msg="good bye" file3 file4


              This would set the awk variable msg to the string hello before starting to process the file file1. It would retain that value until the value is change to good bye just before processing file3. Note that variables set in this way would not be available inside any BEGIN block in the awk code.



              Injecting shell variables directly into the awk code by means of a variable expansion in the string that constitutes the code is not a good way of transferring data into an awk program, and should be avoided.






              share|improve this answer




























                3












                3








                3







                To set an awk variable on the command line, use -v variable=value:



                awk -v attrs=2 '{ ... NF < attrs && ... }'


                You may also access environment variables by using ENVIRON["variable"] in the awk code:



                export attrs=2
                awk '{ ... NF < ENVIRON["attrs"] && ... }'


                or,



                attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


                or,



                env attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


                The last two variations would not set attrs in the invoking environment, only for the awk program (and any processes it may possibly start).



                A third way is to give variable=value as a "filename" argument:



                awk '...' msg="hello" file1 file2 msg="good bye" file3 file4


                This would set the awk variable msg to the string hello before starting to process the file file1. It would retain that value until the value is change to good bye just before processing file3. Note that variables set in this way would not be available inside any BEGIN block in the awk code.



                Injecting shell variables directly into the awk code by means of a variable expansion in the string that constitutes the code is not a good way of transferring data into an awk program, and should be avoided.






                share|improve this answer















                To set an awk variable on the command line, use -v variable=value:



                awk -v attrs=2 '{ ... NF < attrs && ... }'


                You may also access environment variables by using ENVIRON["variable"] in the awk code:



                export attrs=2
                awk '{ ... NF < ENVIRON["attrs"] && ... }'


                or,



                attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


                or,



                env attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'


                The last two variations would not set attrs in the invoking environment, only for the awk program (and any processes it may possibly start).



                A third way is to give variable=value as a "filename" argument:



                awk '...' msg="hello" file1 file2 msg="good bye" file3 file4


                This would set the awk variable msg to the string hello before starting to process the file file1. It would retain that value until the value is change to good bye just before processing file3. Note that variables set in this way would not be available inside any BEGIN block in the awk code.



                Injecting shell variables directly into the awk code by means of a variable expansion in the string that constitutes the code is not a good way of transferring data into an awk program, and should be avoided.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Jan 26 at 13:04

























                answered Jan 26 at 12:38









                KusalanandaKusalananda

                128k16241398




                128k16241398






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Unix & Linux Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f496869%2fhow-to-assign-value-at-run-time-in-awk-command%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    How to make a Squid Proxy server?

                    Is this a new Fibonacci Identity?

                    19世紀