#awk #sed
#awk #sed
Вопрос:
У меня огромное количество данных в следующем формате, и я хочу вставить » » в каждое найденное число.
Ввод:
202, "Pen" ,
203, "Unassigned" ,
204, "Pencil" ,
205, "Scissor" ,
206, "Mouse" ,
207, "Unassigned" ,
208, "Laptopn" ,
209, "Unassigned" ,
210, "Unassigned" ,
Ожидаемый результат:
'202', "Pen" ,
'203', "Unassigned" ,
'204', "Pencil" ,
'205', "Scissor" ,
'206', "Mouse" ,
'207', "Unassigned" ,
'208', "Laptopn" ,
'209', "Unassigned" ,
'210', "Unassigned" ,
Что я делаю, так это следующее:
awk ' { for ( i = 1; i <= NF; i ) {
if ( $i == int )
r = 1
}
}1 ' example.txt > example2.txt
Комментарии:
1. Пожалуйста, добавьте свои усилия в свой вопрос, что настоятельно рекомендуется в SO (кстати, не мой downvote).
2. Я новичок в этом, спасибо за ваш комментарий кстати @RavinderSingh13
3. Ваш код не проверяет, является ли поле целым числом; он проверяет, равно ли оно необъявленной переменной
int
(поэтому эффективно проверяет, равно ли оно пустой строке или нулю).4. Я считаю, что этот вопрос следует повторно открыть, поскольку OP добавил усилия, о которых идет речь.
Ответ №1:
Не могли бы вы, пожалуйста, попробовать следовать, написанным и протестированным точно на основе показанных вами примеров в GNU awk
.
awk '
($1~/^[0-9] ,$/){
$1="47"$1
sub(/,$/,"47amp;",$1)
}
1
' Input_file
ИЛИ, если у вас есть несколько полей, где вам нужно преобразовать все поля, начиная с цифр, обернутых '
затем, попробуйте следующее.
awk '
{
for(i=1;i<=NF;i ){
if($i~/^[0-9] ,$/){
$i="47"$i
sub(/,$/,"47amp;",$i)
}
}
}
1
' Input_file
Объяснение: добавление подробного объяснения выше. Объяснение для 1-го и 2-го решения одинаковое, единственное различие между этими 2: 1-е относится к 1-му полю с точки зрения подстановки, а 2-е решение проходит через все поля для выполнения подстановки.
awk ' ##Starting awk program from here.
{
for(i=1;i<=NF;i ){ ##Traversing through all fields of current line here.
if($i~/^[0-9] ,$/){ ##Checking condition if current field starts from digits(continously) and ends with a comma then do following.
$i="47"$i ##Adding single quote before current field then.
sub(/,$/,"47amp;",$i) ##Substituting comma(comint at last of field) with single quote and comma in current field.
}
}
}
1 ##1 will print current line here.
' Input_file ##Mentioning Input_file name here.
Комментарии:
1. Отлично! Это работает, как и ожидалось, не могли бы вы немного объяснить?
2. @Luka, теперь добавили подробное объяснение решений, приветствия.
3. @Luka, также я надеюсь, что ваш фактический Input_file совпадает с показанными примерами, где запятая идет после цифр, потому что мои решения имеют дело с этим, позвольте мне сейчас, если есть какие-либо вопросы здесь.
4. Еще один вопрос, который я забыл, как я мог изменить первую запятую в поле ecah на «‘:»‘, чтобы получить ‘202’: «Ручка», ‘203’: «Неназначенный» ,
5. @Luka, просто измените
sub(/,$/,"47amp;",$1)
НАsub(/,$/,"47:",$1)
в первом решении и измените сsub(/,$/,"47amp;",$i)
НАsub(/,$/,"47:",$i)
в приведенных выше решениях, и у нас все должно быть готово.