2014-11-05 6 views
0

Я пытаюсь написать сценарий, который удаляет строку из текстовой базы данных, если заголовок соответствует полю этого заголовка. Например, у меня есть текстовый файл, который выглядит какУдаление строки из текстового файла в bash?

Name Age Identification Wage 
Micheal 25 19339 10 
Jane 37 19338 10 
John 21 19334 12 
Peter 35 19330 30 

Я называю сценарий, и передать имя заголовка и значение, и он ищет строку, содержащую это значение под заголовком, и быстро удаляет его , Таким образом, поставив

./script.sh filename Identification 19334 

Если удалить запись в базе данных которого Идентификация 19334, так что файл теперь выглядит следующим образом:

Name Age Identification Wage 
Micheal 25 19339 10 
Jane 37 19338 10 
Peter 35 19330 30 

Как бы использовать сценарий Awk или СЭД, чтобы удалить эту конкретную строку?

ответ

0
awk -v val=$3 -v hdr=$2 '{for(i=1; i<=NF; i++){if($i==hdr && NR==1){col=i;break}} if($col!=val){print}}' $1 > newfile && mv newfile $1 
1

Это AWK не будет непосредственно обновить файл, но даст желаемый результат:

awk -v header="Identification" -v value="19334" 'NR==1 {for(i=1;i<=NF;i++) cols[$i]=i} $(cols[header])!=value' data 
Name Age Identification Wage 
Micheal 25 19339 10 
Jane 37 19338 10 
Peter 35 19330 30 
  • Переменная header устанавливается Identification с помощью -v флаг
  • value устанавливается на значение, чтобы соответствовать при использовании другого -v flag
  • Ассоциативный массив cols настроен таким образом, чтобы заголовкам столбцов были присвоены номера их полей
  • Наконец, напечатать любую строку, где header указано столбец не соответствует value

нескольких строк, соответствующих value будут удалены.

Мой Баш-фу слаб, но будет делать то, что вы хотите:

#!/bin/bash 

newFile=$(awk -v header="$2" -v value="$3" 'NR==1 {for(i=1;i<=NF;i++) cols[$i]=i 
} $(cols[header])!=value' $1); 

echo "$newFile" > $1 

Скрипт Баш будет:

  • Назначают результаты сценария AWK к newFile переменной, где $2 это заголовок, $3 - это значение, а $1 - это входной файл.
  • Переписать содержимое переменной newFile над содержимым первого арг, $ 1

Вы можете запустить его, как вы описали:

./script.sh data Identification 19334 

который изменяет исходный файл и производит:

Name Age Identification Wage 
Micheal 25 19339 10 
Jane 37 19338 10 
Peter 35 19330 30 

Одно предостережение в том, что mispelling заголовок будет перезаписывать весь файл с оригинальным содержанием, и, возможно, оставит вас удивляясь, почему это не сработало.

+1

перенаправлять '$ NewFile»> $ 1' мило, но не является стандартной практикой. Типичным решением является 'AWK '{сценарий вещи}' Файл> file.new && мв file.new file'. Это будет только 'mv' file.new, когда программа' awk' НЕ имела ошибок.Хранение гигантского файла в переменной (например, $ newFile) возможно, но трудно отлаживать при возникновении проблем. Всем удачи. – shellter

Смежные вопросы