Transformer plusieurs lignes en une seule avec awk et séparateur ;

dofre114 -  
 dofre114 -
Bonjour,

J'ai un fichier qui se présente sous cette forme :
#?BEGIN_SITE
alias=***
ip=***
...
..
#?END_SITE
#?BEGIN_SITE
alias=***
ip=***
...
..
#?END_SITE

répété des centaines de fois.
j'aimerai avoir chaque bloque sur une seule ligne de type :

alias=**;ip=***;****;****;***

BEGIN_SITE et END_SITE étant les délimiteurs pour chaque nouvelle ligne. merci pour votre aide.

Configuration: Windows / Firefox 79.0

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Avec sed

    $ cat f1
    #?BEGIN_SITE
    alias=***
    ip=***
    ...
    ..
    #?END_SITE
    #?BEGIN_SITE
    alias=***
    ip=***
    ...
    ..
    #?END_SITE


    Solution 1 :

    $ sed '/^#?BEGIN/{:z;N;/#?END_/!bz;s/\n/;/g}' f1 
    #?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE
    #?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE


    Solution 2 :

    $ sed '/^#?BEGIN/{n;:z;N;/#?END_/!bz;s/\n/;/g;s/;#/\n#/}' f1 
    #?BEGIN_SITE
    alias=***;ip=***;...;..
    ?END_SITE
    #?BEGIN_SITE
    alias=***;ip=***;...;..
    #?END_SITE


    ;-)

    1
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    sur Solaris, utiliser nawk
    $ nawk '/END/ {c=RS} /BEGIN|END/ {print c $0; c=""; next} {printf $0 ";"}' fichier
    #?BEGIN_SITE
    alias=***;ip=***;...;..;
    #?END_SITE
    #?BEGIN_SITE
    alias=***;ip=***;...;..;
    #?END_SITE
    $
    $ nawk '{printf $0 ";"} /END/ {print ""}' fichier
    #?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE;
    #?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE;
    1
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      sans ; en fin de ligne
      $ nawk '{c=";"} /END/ {c=RS} {printf $0 c}' fichier
      #?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE
      #?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE
      0
      1. dofre114 > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
         
        merci beaucoup ça fonctionne, j'aimerai supprimer #?BEGIN_SITE et #?END_SITE j ai pensé untiliser ta première commande et utiliser grep -v mais si on peut faire ça sur une seule ligne c'est plus propre avec nawk.

        j'aimerai avoir également une premiére ligne de ce type:
        alias;ip; ***** correspondant à chaque ligne avant le =
        et ensuite toutes les lignes avec les résultats correspondant à ce qui se trouve aprés le =

        je voulais utiliser un pipe et remettre un awk derriére mais il y a peut être possibilité de tout faire sur la même commande ?

        ça donnerait :
        alias;ip;port;***;
        vh-gr00;10.198.87.12;2343;*****
        vh-gr02;10.198.78.13;2453;****
        0
      2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660 > dofre114
         
        montre un exemple de données
        0
  3. dofre114
     
    Merci beaucoup , j'avais pas creuser sed , j'ai juste un petit problème, je n'avais pas précisé je suis sur solaris j'ai un label too long lorsque je lance la commande, je suis entrain de chercher apparemment il faut découper le sed.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Dans un premier temps, essaies de mettre la syntaxe dans un script qu'on appellera depuis la commande.

      1 - script.sed :
      $ cat script.sed 
      /^#?BEGIN/ {
      n
      :z
      N
      /#?END_/ !b z
      s/\n/;/g
      s/;#/\n#/
      }


      Exécution :
      $ sed -f script.sed f1
      #?BEGIN_SITE
      alias=***;ip=***;...;..
      #?END_SITE
      #?BEGIN_SITE
      alias=***;ip=***;...;..
      #?END_SITE


      2 - script_2.sed :
      $ cat script_2.sed 
      /^#?BEGIN/ {
      :z
      N
      /#?END_/ !b z
      s/\n/;/g
      }


      Exécution :
      $ sed -f script_2.sed f1
      #?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE
      #?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE


      Si ça ne marche pas, on essaiera d'autre(s) solution(s)…
      0
  4. dofre114
     
    ça fonctionne trés bien

    /^#?BEGIN/ {
    :z
    N
    /#?END_/ !b z
    s/\n/;/g
    }
    s/#?BEGIN_SITE;//
    s/;#?END_SITE//
    s/='/=/g
    s/';/;/g

    ça me donne :

    s_alias=*******;s_proto_ident=******;s_protocol=SFTP;s_version=;s_comments=******;s_group=GDEFAULT;s_username=;s_snd_msg=;s_local_site=N;s_init_sender=Y;s_resp_sender=Y;s_init_receiver=Y;s_resp_receiver=Y;s_old_password=;s_old_password2=;s_password=;s_password2=;s_check_password=;s_check_password2=;s_restart_allowed=N;s_resync_allowed=N;s_eerp_style=;s_acknowledgment_option=ACK_UNKNOWN;s_special_logic=N;s_get_appli_method=AIE;s_trans_mode=NONE;s_ftp_restart_type=BOTH;s_ftp_data_struct=NONE;s_ftp_passive_mode=NONE;s_change_data_addr=N;s_poll_option=N;s_poll_responder=N;s_poll_interval=0;s_poll_conn_max=0;s_nack_option=N;s_permanent_conn=N;s_conn_hold_delay=0;s_heartbeat_rate=0;s_attach_extract_file=Y;s_pop3_auth_method=BASIC;s_oftp_auth_method=NONE;s_error_mail_disposal=undefined;s_smtp_auth_method=NONE;s_mail_address=;s_newline_convention= ;s_max_upload_rate=0;s_max_download_rate=0;s_max_upload_requests_rate=0;s_max_download_requests_rate=0;s_command_sensitivity=0;s_max_upload_file_size=0;s_ftpcs_list_fields=DISABLED;s_ftp_disable_xfb_commands=N;s_ftp_options=0;s_retry_count_max=10;s_retry_delay_min=10;s_retry_delay_max=600;s_init_conn_max=10;s_resp_conn_max=10;s_dir_path=;s_data_size_max=4000;s_data_window=0;s_check_window=0;s_use_etb5_compresion=N;s_login_ident=grh0;s_login_password=*****;s_login_type=Anonymous;s_login_url=;s_login_method=GET;s_login_user_param=;s_is_monitor=N;s_partner_loc_alias=;s_check_login_ident=*****;s_check_login_password=;s_comm_type=TCPIP;s_dest_address=*******;s_org_address=;s_net_proxy=;s_ft_proxy=;s_network_security_option=SSH;s_xpp_entity_name=;s_xpp_object_type=;s_tls_sprof_in=;s_tls_sprof_out=;s_xsr_term_type=NONE;s_xsr_allowed_ra_list=;s_bypass_xsr=N;s_user_data=;s_comm_options=;s_logon=;s_logon_code=U;s_ssh_profile=SFTP_PASSWORD;s_local_private_key_alias=;s_local_certificate_alias=;s_remote_public_key_alias=;s_remote_public_key_group=;s_auth_obj_type=NONE;s_auth_obj_name=;s_auth_obj_password=;s_remote_subject_cert_alias=;s_remote_issuer_cert_alias=;s_remote_subject_name_pattern=;s_remote_issuer_name_pattern=;s_comm_type_1=U;s_dest_address_1=;s_org_address_1=;s_net_proxy_1=;s_ft_proxy_1=;s_user_data_1=;s_comm_options_1=;s_logon_1=;s_logon_code_1=U;s_comm_type_2=U;s_dest_address_2=;s_net_proxy_2=;s_ft_proxy_2=;s_org_address_2=;s_user_data_2=;s_comm_options_2=;s_logon_2=;s_logon_code_2=U;s_comm_type_3=U;s_dest_address_3=;s_org_address_3=;s_net_proxy_3=;s_ft_proxy_3=;s_user_data_3=;s_comm_options_3=;s_logon_3=;s_logon_code_3=U;s_sw_init_xfer_max=0;s_sessions_max=0;s_init_mode=Y;s_resp_mode=Y;s_trace_mode=N;s_poll_mode=N;s_sentinel_transfer_filter=UNDEFINED;s_param1=;s_param2=;s_use_trade_unpacking=undef'

    maintenant j'aimerai créer une première ligne dans mon fichier final :
    s_alias;s_proto_ident;s_protocol;s_version;s_comments;****
    et en dessous les données
          • ;****;*****;***** afin d'avoir un fichier csv directement lisible
    0