split for data manitpulation

28 views
Skip to first unread message

Veera

unread,
Aug 29, 2023, 3:40:42 AM8/29/23
to Ansible Project
Hi,

I have this playbook to print the columns  5 and 6 using the debug.

---
- name: playbook to print columns
  hosts: localhost
  gather_facts: no
  vars:
    myline: This line is a test, two, three, four, five, 6, seven
  tasks:
    - name: play to  print
      debug:
        msg:
          - "{{ myline.split(',')[5] }}"
          - "{{ myline.split(',')[6] }}"


It prints the details , But is there a way to print the columns  4,7 and 11 with a single split option. (instead of listing under msg: )

 - name: play to  print
      debug:
        msg:  "{{ myline.split(',')[4][7][11] }}"

Do split accepts only one square bracket[] parameter? 
 
          


dulh...@mailbox.org

unread,
Aug 29, 2023, 5:22:17 AM8/29/23
to ansible...@googlegroups.com
> Do split accepts only one square bracket[] parameter?
 
the python aquivalent (something similar to this should be happening in the backgound) would be:
 
   >>> myline = 'This line is a test, two, three, four, five, 6, seven'
   >>> print(myline.split(',')[4], myline.split(',')[5], myline.split(',')[6])
   five 6 seven
 
as you do not have an index 11 your concrete example makes no big sense in that regards.
 
I neither found the correct ansible syntax to translate that mentioned python logic into a TASK example like yours though.
maybe someone else here can help out with that
 
 
--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/61d732eb-26b2-460f-98de-1db41a6deccan%40googlegroups.com.

Todd Lewis

unread,
Aug 29, 2023, 7:54:04 AM8/29/23
to ansible...@googlegroups.com, Veera, uto...@gmail.com
You have 6 delimiters, so only 7 fields. Your maximum index therefore is 6.

Setting that issue aside, you can use map(), like so:
    "{{ [2, 4, 5] | map('extract', myline.split(',')) }}"
Cheers,
--
Todd

Veera

unread,
Aug 29, 2023, 11:45:51 AM8/29/23
to Ansible Project
Thanks  Todd. 
 I  got the desired output  and it answers the other thread also .

Veera

unread,
Oct 14, 2023, 1:32:51 PM10/14/23
to Ansible Project
Hi Todd,

Is there a way to combine the 2 positional  values .

 "{{ [2, 4, 5] | map('extract', myline.split(',')) }}" 
as 
 "{{ [2, 4 5] | map('extract', myline.split(',')) }}" 
  to print  like below
  - two
 -  four five

I tried to combine .. but missing a bit
 "{{ [2, combine [4 5] | map('extract', myline.split(',')) }}" or  printing "two" as  a item and  "{{ [4 5] | map('extract', myline.split(',')) |combine }}"

or a different filter instead of combine can help?


On Tuesday, August 29, 2023 at 5:24:04 PM UTC+5:30 Todd Lewis wrote:

Vladimir Botka

unread,
Oct 14, 2023, 3:38:39 PM10/14/23
to Veera, ansible...@googlegroups.com
On Sat, 14 Oct 2023 10:32:51 -0700 (PDT)
Veera <svee...@gmail.com> wrote:

> Is there a way to combine the 2 positional values ...
> to print like below
> - two
> - four five

Split the string and trim the items

arr: "{{ myline|split(',')|map('trim') }}"

gives

arr:
- This line is a test
- two
- three
- four
- five
- '6'
- seven

A list of lists the structure that describes what you want

s1_34: "{{ [[1], [3, 4]]|
map('map', 'extract', arr)|
map('join', ' ') }}"

gives

s1_34:
- two
- four five

You can substitute *arr* in *s1_34* if you want a 'one-liner'.


--
Vladimir Botka

Veera

unread,
Oct 16, 2023, 1:29:31 AM10/16/23
to Ansible Project
Hi  Vladimir ,

I got it by using the  join  -  s1_34: "{{ [[1], [3, 4]]| map('map', 'extract', arr)| join(',')}
Reply all
Reply to author
Forward
0 new messages