перебирать файл построчно в tcsh

Вопрос или проблема

Это очень похожий вопрос на Как перебрать строки файла?.

У меня есть файл со строками, содержащими 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:

https://stackoverflow.com/questions/40926372/how-to-iterate-every-line-from-variable-on-the-basis-of-new-line-character-inste

Разделение слов – это то, что 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, которые предлагают мощные средства для работы с текстовыми данными.

Пожалуйста, дайте знать, если у вас есть дополнительные вопросы или вам потребуется помощь с другими аспектами работы в командной строке.

Оцените материал
Добавить комментарий

Капча загружается...