#awk #sed
#awk #sed
Вопрос:
Например, исходный файл данных
file.org
:
1 2 3 4 5
6 7 8 9 0
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Вставьте три точки данных (0) в столбец 2,
Выходной файл должен выглядеть следующим образом
file.out
:
1 0 3 4 5
6 0 8 9 0
11 0 13 14 15
16 2 18 19 20
21 7 23 24 25
Пожалуйста, помогите.
Комментарии:
1. Очень хорошая правка! ( 1) за это. Я бы все же предложил немного изменить заголовок. Может быть, что-то вроде добавления столбца с n нулями и обрезки избыточных значений .
2. Хороший выбор для принятого ответа!
Ответ №1:
Следующее awk
сделает свое дело:
awk -v n=3 '{a[NR]=$2; $2=a[NR-n] 0}1' file
Комментарии:
1. @Bossjara На самом деле это не то, о чем ваш первоначальный вопрос, но вы можете просто удалить
END
блок, чтобы добиться этого. (awk -v n=5 '{a[NR]=$2; $2=a[NR-n] 0; print}' file
)2. @Bossjara Частью Stack OVerflow, помимо вопросов и ответов на них, является также модерация и очистка. Как вы заметили, большинство наших комментариев ниже моего ответа теперь неактуальны и сбивают с толку будущих читателей. Пожалуйста, будьте так любезны, удалите все не относящиеся к делу комментарии из этой записи.
Ответ №2:
$ awk -v n=3 '{x=$2; $2=a[NR%n] 0; a[NR%n]=x} 1' file
1 0 3 4 5
6 0 8 9 0
11 0 13 14 15
16 2 18 19 20
21 7 23 24 25
Комментарии:
1. Я имел в виду ту же идею. Это немного безопаснее на стороне памяти!
2. @kvantour да, мне нравится твоя простота, но он сказал, что его входной файл огромен, поэтому я выбрал это (плюс это первое, что пришло на ум :-)).
Ответ №3:
Если вы хотите попробовать Perl,
$ cat file.orig
1 2 3 4 5
6 7 8 9 0
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
$ perl -lane ' BEGIN { push(@t,0,0,0) } push(@t,$F[1]);$F[1]=shift @t; print join(" ",@F) ' file.orig
1 0 3 4 5
6 0 8 9 0
11 0 13 14 15
16 2 18 19 20
21 7 23 24 25
$
Комментарии:
1. Извините, я не могу использовать Perl.
Ответ №4:
РЕДАКТИРОВАТЬ: Поскольку OP отредактировал вопрос, поэтому добавляю решение в соответствии с новым вопросом.
awk -v count=3 ' val<=count{a[val]=$2;$2=0} val>count{if( re_count<=count){$2=a[re_count]}} 1' Input_file
Результат будет следующим.
1 0 3 4 5
6 0 8 9 0
11 0 13 14 15
16 2 18 19 20
21 7 23 24 25
Не могли бы вы, пожалуйста, попробовать следующее.
awk -v count=5 '
BEGIN{
OFS="t"
}
$2{
val=(val?val ORS OFS:OFS)$2
$2=0
occ
$1=$1
}
1
END{
while( occ<=count){
print OFS 0
}
print val
}' Input_file
Результат будет следующим.
1 0 3 4 5
6 0 8 9 0
11 0 13 14 15
0
0
2
7
12
Комментарии:
1. Я действительно извиняюсь за неудобства.
2. @Bossjara, не могли бы вы, пожалуйста, проверить мой ответ на редактирование и затем сообщить мне?
3. Я не могу запустить его.
4. Почему, у меня это отлично сработало. Не могли бы вы, пожалуйста, сообщить мне, если вы получаете какие-либо ошибки и т.д.?