Копировать word из 1 файла в другой с помощью Bash

#bash #awk

#bash #awk

Вопрос:

Я пытаюсь скопировать только определенные слова из 1 текстового файла в другой.

это то, что находится внутри моего username2.txt:

 jason,visitor
mark,staff
orlando,visitor
  

Я пытаюсь скопировать только Джейсона и Орландо в другой текстовый файл, так что это будет похоже на:

 jason
orlando
  

в настоящее время это мой скрипт bash (на данный момент он создает только пустой текстовый файл):

 #!/bin/bash

username="username2.txt"

while IFS=, read username1 group1; do
 if [ $group1 = "visitor" ]; then
   awk $username1 $username > reportvisitors.txt
 fi
 done < $username
  

Ответ №1:

Это можно было бы легко сделать, awk и нам не нужно использовать цикл while для этого, поскольку awk он сам может читать Input_file.

 username="username2.txt"
awk -F, '$2=="visitor"{print $1}' "$username" > "reportvisitors.txt"
  

Объяснение: Простое объяснение заключается в том, чтобы сделать разделитель полей , одинаковым для всех строк Input_file(который является переменной оболочки с именем username ). Затем внутри основного условия проверки программы $2=="visitor" , чтобы проверить, является ли 2-е поле посетителем, а затем напечатать 1-й столбец. Наконец, эта awk программа отправляет вывод на reportvisitors.txt .

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

1. Попробовал, спасибо! и спасибо за объяснение, а также!

2. @Kinja как насчет того, чтобы принять этот ответ, тогда ваша проблема решена, не так ли? 😉

Ответ №2:

Заменить

 awk $username1 $username > reportvisitors.txt
  

с

 echo "$username1" >> reportvisitors.txt
  

Обновить

 #!/bin/bash

username="username2.txt"

while IFS=, read username1 group1; do
 if [ "$group1" = "visitor" ]; then
   echo "$username1"
 fi
 done < $username > reportvisitors.txt
  

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

1. Попробовал, спасибо! глупый вопрос, мне разрешено использовать «echo» только для этого сценария?

2. Если вы хотите вывести содержимое переменной, вы также можете использовать printf . Смотрите help printf .

3. Хорошо, в любом случае, как я могу вместо этого перезаписать его? потому что, если я ударю его дважды, он отобразит имена дважды

4. Удалите >> reportvisitors.txt и добавьте > reportvisitors.txt в свою done строку.

5. я действительно пробовал, но он отображает только orlando в reportvisitors.txt , Джейсона нигде не найти, ха-ха

Ответ №3:

Вам нужно отредактировать строку 7, чтобы

 echo $username1 >> reportvisitors.txt
  

Код должен выглядеть следующим образом

 #!/bin/bash
  

Эта часть гарантирует, что уже существующий файл с именем будет удален

 FILE=reportvisitors.txt
if test -f "$FILE"; then
    rm $FILE 
fi
  

с этого момента я отредактировал только строку 5

 username="username2.txt"

while IFS=, read username1 group1; do
    if [ $group1 = "visitor" ]; then
        echo $username1 >> reportvisitors.txt
    fi
done < $username
  

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

1. Хорошо, в любом случае, как я могу вместо этого перезаписать его? потому что, если я ударю его дважды, он отобразит имена дважды

2. вы можете удалить файлы в начале кода, но при первом запуске вы получите сообщение об ошибке. Это все равно работает. Или добавьте оператор if, чтобы он просто удалялся, если есть файл

3. Я просто добавил свой ответ. Так и должно быть. Не так ли?