Что-то в этом роде должно работать:
awk 'NR == FNR { to_shift[$1,$2] = 1; next } { queue[++w] = $3 OFS $4 } to_shift[$1, $2] { print $1, $2; next } { print $1, $2, queue[++r] } END { while(r != w) { print OFS OFS queue[++r] } }' file1 file2
То есть:
NR == FNR { # while processing the first file (file1)
to_shift[$1,$2] = 1 # remember which lines to shift
next # and do nothing else
}
{ # afterwards (processing file2):
queue[++w] = $3 OFS $4 # queue the next payload fields
}
to_shift[$1, $2] { # If this is a shift line
print $1, $2 # print only the first two fields
next # and do nothing else
}
{ # otherwise, print the first two fields and
print $1, $2, queue[++r] # the next queued payload
}
END { # In the end:
while(r != w) { # print out what remains in the queue, i.e.
print OFS OFS queue[++r] # all that was shifted out at the bottom
}
}
Я подозреваю, что для форматирования вы можете использовать \t
в качестве разделителя выходных полей, и в этом случае вы можете просто передать -v OFS='\t'
в awk
:
awk -v OFS='\t' 'NR == FNR { to_shift[$1,$2] = 1; next } { queue[++w] = $3 OFS $4 } to_shift[$1, $2] { print $1, $2; next } { print $1, $2, queue[++r] } END { while(r != w) { print OFS OFS queue[++r] } }' file1 file2
Если ввод разделен табуляцией, а поля могут содержать пробелы, также передайте -F '\t'
, чтобы сделать разделитель полей ввода табуляцией.
24.08.2015