0

I am trying to get the following output. I have 2 input files and we need only the common :names from both the input files along with there the lines below them the .name/of/file lines.

Till now I have tried:

awk 'FNR==NR { a[$1]; next }NF<=1{ flag=0 }$1 in a { print; flag=1; delete a[$1]; next }flag{ printf "%s\n",$0 }' file1 file2

Output:

:name1
    ./name/of/file [logfile] [ error in file coming since Day : 1 ]
    ./name/of/file [logfile] [ error in file coming since Day : 1 ]
:name3
    ./name/of/file [logfile] [ error in file coming since Day : 24 ]
    ./name/of/file [logfile] [ error in file coming since Day : 24 ]
:name4
    ./name/of/file [logfile] [ error in file coming since Day : 3 ]
    ./name/of/file [logfile] [ error in file coming since Day : 3 ]
    ./name/of/file [logfile] [ error in file coming since Day : 3 ]
    ./name/of/file [logfile] [ error in file coming since Day : 3 ]

Input file1:

:name1
./name/of/file [logfile] [ error in file coming since Day : 1 ]
./name/of/file [logfile] [ error in file coming since Day : 1 ]

:name2
./name/of/file [logfile] [ error in file coming since Day : 1 ]

:name3
./name/of/file [logfile] [ error in file coming since Day : 24 ]
./name/of/file [logfile] [ error in file coming since Day : 24 ]

 :name1
./name/of/file [logfile] [ error in file coming since Day : 40]
./name/of/file [logfile] [ error in file coming since Day : 40 ]

:name4
./name/of/file [logfile] [ error in file coming since Day : 3 ]
./name/of/file [logfile] [ error in file coming since Day : 3 ]
./name/of/file [logfile] [ error in file coming since Day : 3 ]
./name/of/file [logfile] [ error in file coming since Day : 3 ]

:name5
./name/of/file [logfile] [ error in file coming since Day : 6 ]
./name/of/file [logfile] [ error in file coming since Day : 6 ]

:name4
./name/of/file [logfile] [ error in file coming since Day : 10 ]
./name/of/file [logfile] [ error in file coming since Day : 10 ]
./name/of/file [logfile] [ error in file coming since Day : 10 ]
./name/of/file [logfile] [ error in file coming since Day : 10 ]  

Input file2:

:name1 ABC123 12345
:name3 EFG789 67898
:name4 HIJ547 01234

Required Outputfile:

:name1 ABC123 12345
    ./name/of/file [logfile] [ error in file coming since Day : 1 ]
    ./name/of/file [logfile] [ error in file coming since Day : 1 ]
:name3 EFG789 67898
    ./name/of/file [logfile] [ error in file coming since Day : 24 ]
    ./name/of/file [logfile] [ error in file coming since Day : 24 ]
:name4 HIJ547 01234
    ./name/of/file [logfile] [ error in file coming since Day : 3 ]
    ./name/of/file [logfile] [ error in file coming since Day : 3 ]
    ./name/of/file [logfile] [ error in file coming since Day : 3 ]
    ./name/of/file [logfile] [ error in file coming since Day : 3 ]

1 Answer 1

1
  1. There was a typo in your command: file1 and file2 should have been swapped.
  2. The first field was saved in array a as index, but the remaining line (or $2 and $3) was missing as value. The value needs to be printed later.
  3. Four spaces of indentation were missing to match your expected output.

old:

awk '
    FNR==NR { a[$1]; next }
    NF<=1{ flag=0 }
    $1 in a { print; flag=1; delete a[$1]; next }
    flag{ printf "%s\n",$0 }
' file1 file2

new:

awk '
    FNR==NR { k=$1; $1=""; a[k]=$0; next }
    NF<=1{ flag=0 }
    $1 in a { print $0 a[$1]; flag=1; delete a[$1]; next }
    flag{ print "    " $0 }
' file2 file1

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .