Заполнить столбец с n нулями и обрезать избыточные значения

#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. Почему, у меня это отлично сработало. Не могли бы вы, пожалуйста, сообщить мне, если вы получаете какие-либо ошибки и т.д.?