Вопрос или проблема
Это очень похожий вопрос на Как перебрать строки файла?.
У меня есть файл со строками, содержащими n полей, разделённых пробелами. Я хочу перебрать этот файл построчно и использовать поля как переменные для получения информации из другого файла.
Например, мой файл выглядит так:
A B C
D E F
H I J
K L M
Я хотел бы перебрать каждую строку и установить переменные как поля:
foreach i ( `cat file ` )
set 1st = $i[1]; set 2nd = $i[2]; set 3rd = $i[3]
end
В данный момент моя оболочка использует пробелы для разделения полей, и это означает, что я не могу установить 3 переменные в каждой строке.
Если бы я echo
каждое $i
, я бы увидел это:
A
B
C
D
....
Я хотел бы знать, как управлять моим циклом, используя только новые строки в качестве разделителей.
Вот что я действительно хочу достичь. Я хочу найти строки в файле A, которые содержат 3 различные значения, все из которых появляются как элементы, разделённые пробелами, в строках файла B. Мой план заключался в том, чтобы перебрать каждую строку в файле B, устанавливая переменные для каждого из (разделённых пробелами) элементов в этой строке B, а затем использовать эти 3 элемента. И затем повторить для следующей строки B. Но мой цикл не работает, потому что он не видит строки в файле B. Он видит только ВСЕ разделённые пробелами элементы, не распознавая их группировку в строки по 3 элемента. Надеюсь, это не сбивает с толку.
Я не знаю, было ли изначально достаточно ясно сформулировано, но, похоже, у меня есть проблема в моей среде оболочки с перебором строк текстового файла, где строки имеют разделённые пробелами элементы, такие как, например
строка 1: A B C
строка 2: D E F
Я нашёл обходной путь, преобразовав каждую строку в один элемент, так что я могу позже его разобрать для использования, выходящего за рамки (как мне кажется) этого вопроса. Таким образом, мои две строки выше становятся
строка 1: A_B_C
строка 2: D_E_F
в таком формате, мой цикл foreach видит каждую строку как единственный элемент, и если мне сейчас нужно B в первой итерации, я могу использовать, например:
foreach i ( `cat <file>` )
foreach? set a = `echo $i | awk -F '_' '{print($2)}'`
foreach? echo $a
foreach? end
Это должно вывести:
B
E
что будет вторым элементом в каждой строке моего файла.
Спасибо всем, кто проявил интерес, и если есть более элегантный способ сделать это, пожалуйста, дайте мне знать.
Я wish для некоторых людей просто ответить на вопрос. Это возможно? Да. Рекомендуется? Нет. Но если вы ДОЛЖНЫ это сделать, вы можете следовать ответу на этом stackoverflow:
Разделение слов – это то, что csh почти делает лучше, чем оболочка Bourne. В csh, "`cmd`"
разбивает вывод cmd
на его непустые строки, не выполняя глоббинга, в то время как `cmd`
разбивается на пробелах, табуляциях или новых строках и выполняет глоббинг. Так что вы могли бы сделать:
set n = 0 noglob
foreach line ( "`cat file`" )
@ n++
set field = ( $line )
echo Первое поле строки $n - это $field[1], второе - $field[2]
end
Хотя, конечно, для обработки текста по строкам и полям вы бы использовали что-то вроде perl
или awk
, а не оболочку.
Ответ или решение
Вопрос о том, как пройтись по строкам файла в среде командной оболочки tcsh, касается многих системных администраторов и специалистов в области информационных технологий, работающих с текстовыми данными. В данной статье мы рассмотрим, как осуществить эту задачу с использованием подходящих команд и синтаксиса tcsh.
Как пройти строкам файла в tcsh
Описание проблемы
Исходя из приведенных примеров, ваша цель заключается в том, чтобы обойти строки файла, содержащие поля, разделенные пробелами, и установить каждое поле в отдельные переменные для дальнейшей обработки. Например, для файла с содержимым:
A B C
D E F
H I J
K L M
вы хотите получить доступ к каждому элементу строки, чтобы использовать их в других командах, например, чтобы фильтровать информацию из другого файла.
Способы решения
1. Использование foreach
с set
для разделения строк
Во-первых, важно отметить, что в tcsh команды, такие как cat
, будет проще обрабатывать, если вы будете использовать их с кавычками. Это предотвратит нежелательное разделение на пробелы, что и произошло в вашем первоначальном варианте.
Вот пример кода, который решает вашу задачу:
set n = 0
foreach line ( "`cat файл.txt`" )
@ n++
set field = ( $line ) # разделяем строку на отдельные поля
echo "Первое поле строки $n: $field[1], Второе поле: $field[2], Третье поле: $field[3]"
end
2. Пояснение кода
set n = 0
— инициализирует счетчик строк.foreach line ( "
cat файл.txt" )
— считывает строки файлафайл.txt
как отдельные элементы.@ n++
— увеличивает счетчик строк каждый раз при итерации.set field = ( $line )
— разбивает текущую строку на массивfield
, где каждое поле строки становится элементом массива.echo
— используется для вывода значений полей.
3. Вывод на экран
С помощью данного подхода, вы сможете выводить значения сайд-айями:
Первое поле строки 1: A, Второе поле: B, Третье поле: C
Первое поле строки 2: D, Второе поле: E, Третье поле: F
...
Заключение
Использование tcsh для обработки текстовых файлов — задача, которая может быть выполнена довольно эффективно при соблюдении правильного синтаксиса и порядка команд. Вместо того чтобы разрываться между различными подходами, можно воспользоваться мощью командного процессора, что позволяет вам легко манипулировать данными. Как было показано в этом примере, правильное использование массивов и итераторов делает вашу работу более организованной и менее подверженной ошибкам.
Для более сложной обработки текстов рекомендуется изучить другие инструменты, такие как awk
или perl
, которые предлагают мощные средства для работы с текстовыми данными.
Пожалуйста, дайте знать, если у вас есть дополнительные вопросы или вам потребуется помощь с другими аспектами работы в командной строке.