sedception
Если второй столбец file2.txt
всегда равен индексу его строки, вы можете использовать sed
для сокращения строк. Если это не ваш случай, обратитесь к пункту awkception .
sed $(sed 's/^\([0-9]*\)[[:space:]]*\([0-9]*\)/-e \1,\2d/' file1.txt) file2.txt
Где file1.txt
содержит ваши диапазоны, а file2.txt
- сами данные.
По сути, он создает вызов sed
, который объединяет список выражений -e i,jd
, что означает удаление строк между строкой ith и строкой jth .
В вашем примере sed 's/^\([0-9]*\)[[:space:]]*\([0-9]*\)/-e \1,\2d/' file1.txt
выдаст -e 2,4d -e 6,9d -e 13,14d
, который представляет собой список выражений для вызова sed
на file2.txt
.
В конце он вызовет:
sed -e 2,4d -e 6,9d -e 13,14d file2.txt
Эта команда удаляет все строки между 2-м и 4-м и все строки между 6-м и 9-м и все строки между 13-м и 14-м.
Очевидно, что она не работает если второй столбец file2.txt
не не соответствует индексу собственной строки.
awkception
awk "{$(awk '{printf "if ($2>=%d && $2<=%d) next\n", $1, $2}' file1.txt)}1" file2.txt
Это решение работает, даже если второй столбец не соответствует индексу его строки.
Метод использует awk
для создания программы awk
, точно так же, как sed
создал sed
выражений в решении sedception .
В конце это вызовет:
awk '{
if ($2>=2 && $2<=4) next
if ($2>=6 && $2<=9) next
if ($2>=13 && $2<=14) next
}1' file2.txt
Следует отметить, что это решение значительно медленнее, чем sed
.