Home > Mobile >  awk to get value for a column of next line and add it to the current line in shellscript
awk to get value for a column of next line and add it to the current line in shellscript

Time:03-18

I have a csv file lets say lines

cat lines
1:abc
6:def
17:ghi
21:tyu

I wanted to achieve something like this

1:6:abc
6:17:def
17:21:ghi
21::tyu

Tried the below code by didn't work

awk 'BEGIN{FS=OFS=":"}NR>1{nln=$1;cl=$2}NR>0{print $1,nln,$2}' lines
1::abc
6:6:def
17:17:ghi
21:21:tyu

Can you please help ?

CodePudding user response:

1st solution: Here is a tac awk tac solution. Written and tested with shown samples only.

tac Input_file | 
awk '
BEGIN{
  FS=OFS=":"
}
{
  prev=(prev?$2=prev OFS $2:$2=OFS $2)
}
{
  prev=$1
}
1
' | tac


2nd solution: Adding Only awk solution with 2 times passing Input_file to it.

awk '
BEGIN{
  FS=OFS=":"
}
FNR==NR{
  if(FNR>1){
    arr[FNR-1]=$1
  }
  next
}
{
  $2=(FNR in arr)?(arr[FNR] OFS $2):OFS $2
}
1
'  Input_file  Input_file

CodePudding user response:

Here is a potential AWK solution:

cat lines
1:abc
6:def
17:ghi
21:tyu

awk -F":" '{num[NR]=$1; letters[NR]=$2}; END{for(i=1;i<=NR;i  ) print num[i] ":" num[i   1] ":" letters[i]}' lines
1:6:abc
6:17:def
17:21:ghi
21::tyu

Formatted:

awk '
BEGIN {FS=OFS=":"}
{
  num[NR] = $1;
  letters[NR] = $2
}
END {for (i = 1; i <= NR; i  )
        print num[i], num[i   1], letters[i]
}
' lines
1:6:abc
6:17:def
17:21:ghi
21::tyu
  • Related