Ввод/Файл
A:1111
B:21222
C:33rf33
D:444dct4
E:5tdffe
F:4444we
G:j5555
H:46666
I:efe989ef
J:efee
В основном нужно выбрать строку, содержащую 2122 (т.е. строку B/2) & строка, начинающаяся с 444dct4 (т.е. строка D) до efe989ef (т.е. строка I/9) Обобщить
Select Line B (contains 2122)
Select Line D (444dct4) till Line I
Желаемый результат
B:21222
D:444dct4
E:5tdffe
F:4444we
G:j5555
H:46666
I:efe989ef
Я думаю, что этот вопрос дублирует stackoverflow.com/questions/12182910/…
Кроме того, вам нужна строка, содержащая 2122 ИЛИ (т.е. строка B ИЛИ 2)
Спасибо, Джеймс. Строка, содержащая 2122
@KarimTawfik Я полагаю, что вопрос касается двух отдельных файлов, если я правильно понимаю. Мне нужен один файл и нужен желаемый результат
awk -v str1 = "2122" -v str2 = "444dct4" -v str3 = "efe989ef" 'BEGIN { flag=0 } $0 ~ str1 { print } $0 ~ str2 { flag=1 } $0 ~ str3 { flag=0;print;next } flag' file
Для гибкости задайте строку для поиска как str1, строку from как str2 и строку to как str3. Установите флаг печати (флаг) для начала. Когда 2122 находится во втором поле, напечатайте. Затем, когда второе поле начинается с 44dct4, установите флаг печати на единицу. Когда второе поле начинается с efe989ef, установите флаг печати на 0, напечатайте строку и перейдите к следующей записи. Затем флаг переменной будет определять, что печатается, а что нет.
спасибо Раман. Я не мог заставить это работать. не могли бы вы поделиться командой, которая работает для вас
Та же команда, что и выше. Я использовал образец примера, который вы разместили. Я также проверил, что вывод соответствует требованиям.
$ awk -F: '
/2122/ { # line that contains 2122
print
next # to avoid duplicate printing if 2122 also in D-I
}
$2~/^444dct4/,$2~/efe989ef/ # starts with 444dct4 till efe989ef
' file
Выход:
B:21222
D:444dct4
E:5tdffe
F:4444we
G:j5555
H:46666
I:efe989ef
Редактировать:
Один лайнер:
$ awk -F: '/2122/{print; next} $2~/^444dct4/,$2~/efe989ef/' file.txt
awk -F: '/2122/ { printnext } $2~ /^444dct4/,$2~ /efe989ef/' файл.txt
Вывод начинается с D и заканчивается до I. Не вижу B в выводе
/2122/ { printnext }
нужен ;
между ними: /2122/ {print; next}
Не могли бы вы попробовать выполнить, написать и протестировать показанные образцы в GNU awk
. Это также заботится о том, чтобы 2-й столбец строки 21222
находился между диапазоном от 444dct4
до efe989ef
, тогда он НЕ будет перепечатывать его.
awk -F':' '
$2= = "21222" && !found{
print
next
}
$2= = "444dct4"{
found=1
}
found
$2= = "efe989ef"{
found = ""
}
' Input_file
Объяснение: Добавлено подробное объяснение вышеизложенного.
awk -F':' ' ##Starting awk program from here and setting field separator as colon here.
$2= = "21222" && !found{ ##Checking if 2nd field is 21222 and found is NOT set then try following.
print ##Printing the current line here.
next ##next will skip all further statements from here.
}
$2= = "444dct4"{ ##Checking condition if 2nd field is 444dct4 then do following.
found=1 ##Setting found to 1 here.
}
found ##Checking condition if found is SET then print that line.
$2= = "efe989ef"{ ##Checking condition if 2nd field is efe989ef then do following.
found = "" ##Nullifying found here.
}
' Input_file ##Mentioning Input_file name here.
Спасибо. я пробовал, но нет выхода. не могли бы вы поделиться командой, которая работает для вас
@PrasadV, это проверенное решение, и оно отлично сработало для меня с показанными вами образцами. Ваш фактический Input_file такой же, как показанные образцы?
Добро пожаловать в SO, не могли бы вы добавить свои усилия в свой вопрос, который настоятельно рекомендуется в SO. Также, пожалуйста, объясните логику получения ожидаемого результата более четко в своем вопросе.