добавить столбец в другой текстовый файл

#linux #bash #for-loop #awk

#linux #bash #for-цикл #awk

Вопрос:

Hii у меня есть текстовый файл с 3 столбцами

 2.0  44.8  789.3 
3.0  58.4  453.0
4.0  97.2 -489.1
5.2  35.3  458.6
 

я хочу выбрать столбцы из приведенного выше текстового файла и хочу добавить выбранный столбец в другой текстовый файл.Файл, в который я хочу добавить указанные выше столбцы, приведен ниже

 > > > > 
    10.0    8.5
    20.0    8.5
    30.0    8.5
    40.0    8.5
> > > >
    10.0    8.0
    20.0    8.0
    30.0    8.0
    40.0    8.0
> > > >
    10.0    9.0
    20.0    9.0
    30.0    9.0
    40.0    9.0
> > > >
 

и мой ожидаемый результат

 > > > > 
    10.0    8.5   2.0
    20.0    8.5   3.0
    30.0    8.5   4.0
    40.0    8.5   5.2
> > > >
    10.0    8.0   44.8
    20.0    8.0   58.4
    30.0    8.0   97.2
    40.0    8.0   35.3
> > > >
    10.0    9.0   789.3
    20.0    9.0   453.0
    30.0    9.0  -489.1
    40.0    9.0   458.6
> > > >
 

я попробовал скрипт, но после этого не получил больше идей, мне нужна помощь экспертов.Заранее спасибо.

  #!/bin/sh
 for file in inp.txt
 do
 awk '{print $1}' > colone
 done
 

Комментарии:

1. Привет и добро пожаловать в SO. В вашем скрипте есть некоторые синтаксические ошибки, пожалуйста, проверьте это.

2. Добро пожаловать в SO. Хорошо, что вы показали свои попытки в своем вопросе. Не могли бы вы, пожалуйста, объяснить логику добавления столбцов в новый файл подробнее в вашем вопросе для лучшего понимания, пожалуйста.

3. да, для моих рабочих целей я пытаюсь это сделать

4. @lijun, как упоминалось и в предыдущем комментарии, не могли бы вы добавить логику добавления столбца (например, в какие строки или номера строк и т. Д.?) В свой вопрос, Чтобы сделать его более понятным.

5. да, первый столбец будет добавлен к первому блоку, затем второй столбец будет добавлен ко второму блоку и т.д…

Ответ №1:

 $ cat tst.awk
NR==FNR {
    for (numBlocks=1; numBlocks<=NF; numBlocks  ) {
        vals[numBlocks,NR] = $numBlocks
    }
    next
}
/^>/ {
    blockNr  
    rowNr = 0
    print
    next
}
{ printf "%s %7sn", $0, vals[blockNr,  rowNr] }
 
 $ awk -f tst.awk file1 file2
> > > >
    10.0    8.5     2.0
    20.0    8.5     3.0
    30.0    8.5     4.0
    40.0    8.5     5.2
> > > >
    10.0    8.0    44.8
    20.0    8.0    58.4
    30.0    8.0    97.2
    40.0    8.0    35.3
> > > >
    10.0    9.0   789.3
    20.0    9.0   453.0
    30.0    9.0  -489.1
    40.0    9.0   458.6
> > > >
 

Комментарии:

1. не могли бы вы подсказать, где вводить данные в скрипте ur

2. Я показываю, где вводить входные данные — awk -f tst.awk file1 file2 . Если вы не хотите сохранять сценарий awk в файле, вы можете просто поместить его в одинарные кавычки в командной строке awk 'script' file1 file2 .

Ответ №2:

Основываясь на показанных примерах OP, не могли бы вы попробовать следующее. Это выведет значение сброса count после 3-го появления > > в текстовом файле и снова начнет печать с значений 1-го столбца и далее из Input_file.

 awk '
FNR==NR{
  for(i=1;i<=NF;i  ){
    value[FNR,i]=$i
  }
  next
}
/^> >/{
  count=0
  print
  if(col==3){ col=0 }
  col  
  next
}
{
  print $0"    "value[  count,col]
}
' Input_file text_file
 

Объяснение: добавление подробного объяснения выше.

 awk '                       ##Starting awk program from here.
FNR==NR{                    ##Checking condition FNR==NR when Input_file is being read.
  for(i=1;i<=NF;i  ){       ##Traversing through all fields here. 
    value[FNR,i]=$i         ##Creating value with index of FNR,i here with value $i
  }
  next                      ##next will skip all further statments from here.
}
/^> >/{                     ##Checking condition if line starts from > > then do following.
  count=0                   ##Nulliffying count here.
  print                     ##Printing current line.
  if(col==3){ col=0 }       ##Checking if col is 3 then make its value 0 here. Why because OP sample has only 3 blocks and
                            ##if there are more than 3 then it will start printing from very 1st values onwards after every 3 blocks.
  col                       ##Increasing value of col with 1 here.
  next                      ##next will skip all further statments from here.
}
{
  print $0"    "value[  count,col]  ##Printing current line with space and array value here.
}
' Input_file text_file      ##Mentioning Input_file and text_file names here.
 

Комментарии:

1. он работает нормально, но можем ли мы добавить больше места между столбцами

2. @lijun, я полагаю, вы имели в виду меньше пробелов, я исправил это сейчас, мы должны получить вывод в том же формате пространства, который уже есть в текстовом файле. Пожалуйста, дайте мне знать, как это происходит сейчас?

3. может ли скрипт ur работать, если у меня больше столбцов в текстовом файле

4. @lijun, я так не думаю, ответы будут даны в соответствии с вопросами. Поэтому, пожалуйста, не меняйте свой базовый вопрос сейчас. Вы могли бы проверить этот ответ на приведенных вами примерах и попытаться поиграть с ним, если у вас есть вопрос, тогда вы могли бы создать новый вопрос своими усилиями на форумах, пожалуйста. Но изменение требования базового вопроса не рекомендуется для SO, приветствия.