#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, приветствия.