#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. Я просто добавил свой ответ. Так и должно быть. Не так ли?