Я хочу распечатать значение из файла CSV динамично

Посмотрите это видео, в котором объясняется все, что вы хотите.

enter image description here

-121--162329-

Предпосылка недоказуема. Наука требует фальсифицируемой гипотезы ; нет пути протестировать какие-либо из вероятных контргипотезов, например, что Windows потерпит крах меньше, если Apple вместо этого запишет все драйверы, или что Windows будет более стабильной, если Microsoft каким-то образом отключит поддержку огромного количества существующего поддерживаемого аппаратного пространства. Вам, в основном, придется перезапустить историю персональных вычислений и иметь всемогущую руку, чтобы перегруппировать факты, чтобы привести к выводу, который вы хотите проверить.

Тем не менее, я считаю, что есть некоторая правда в этом аргументе.

Мой личный опыт в том, что Linux, FreeBSD и OS X все ядра паникуют примерно столько же, что и «редко». В подавляющем большинстве случаев, когда я смог диагностировать причину аварии, она была вызвана драйвером устройства, но, в свою очередь, была вызвана неисправностью оборудования. При разрыве аппаратного обеспечения происходит поломка драйвера устройства, а при разрыве пространства ядра происходит сбой, блокировка или самодиагностика ядра в условиях panic / oops / BSOD .

Что касается того, как это относится к Windows, я думаю, что ситуация заключается просто в том, что коробки Windows, как правило, строятся по произвольной цене, которую выбрал отдел маркетинга. Рынок настолько конкурентоспособен, что углы сокращаются, что оборудование Windows низкого класса выходит из строя чаще, чем это происходит на наших дорогих серверах Mac и * ix.

Вы часто видите это в * ix мирах. Кто-то будет жаловаться на сетевые проблемы, затем упоминать, что они используют какой-то странный встроенный MAC-чип (RealTek, Broadcom и т.д.) и сразу, кто-то скажет им, чтобы они получили карту Intel.

Это также случай, что эта экстремальная ценовая чувствительность на рынке Windows означает, что меньше денег доступно для талантов разработчиков программного обеспечения, поэтому драйверы могут быть написаны не самыми компетентными людьми вокруг. Даже когда в проект вложены хорошие таланты, они отправятся, как только у них появится то, что маркетинг считает достаточно функциональным. Эта команда будет отпущена или перейдет к другому проекту, так что, когда драйвер 1.0 попадет в реальный мир и возникнут непредвиденные проблемы, не будет полностью укомплектованной компетентной команды разработчиков, чтобы исправить эти проблемы.

Я упомянул, что OS X, FreeBSD и Linux все примерно сопоставимы с точки зрения паники ядра в год, потому что это показывает, что количество драйверов не объясняет все здесь. Linux имеет гораздо больше драйверов, чем FreeBSD или OS X, но он примерно так же стабилен, пока вы держитесь подальше от действительно низкого уровня оборудования. Обычно Linux работает не так хорошо на перепрофилированном Windows PC стоимостью 500 долларов, как на специально созданном сервере Linux стоимостью 1500 долларов. Вы платите за компоненты более высокого качества, которые вызывают меньше проблем у водителя, что снижает вероятность аварии.

Если вы используете Windows на том же сервере стоимостью 1500 долларов, я предсказываю, что он будет работать достаточно надежно. Дни ненадежности Windows практически на всем оборудовании начали исчезать с Windows 2000. Проблема больше не в Windows, per se , проблема в том, что скинфлинты движут рынком Windows. Это также является источником многих других бед, таких как «freeware», который вкрадчиво устанавливает грабительское программное обеспечение, чтобы собрать деньги обратно создателям.

Еще один пункт о вашем 85% числе: это не удивительно, так как огромное количество того, что делает ядро, - это запускаемые драйверы, а остальное то, что оно делает, в основном универсальное, и поэтому чрезвычайно хорошо отлаженное. Когда у вас есть 1000 различных чипсы NIC для поддержки, вы не можете ожидать, что они будут так хорошо отлажены, как когда вы поддерживаете только 20 чипсы NIC. И ваш ограниченный набор из 20 драйверов чипов NIC все еще не будет так хорошо отлажен, как, скажем, код передачи сообщений ядра.

-121--210017-

sed 's/\([^/]*\)\.phtml$/mydirectory\/\1.php/' 

Сделает это, если это то, что вам нужно. (опционально с флагом -i для замены на месте.)


Чтобы разорвать его, сначала мы имеем

s///

, который заменит то, что соответствует . Далее давайте посмотрим на regexp у нас было:

\([^/]*\)\.phtml$

Во-первых, в конце у нас есть \.phtml $ , который будет искать последовательность .phtml в конце строки. $ прикрепляет regexp к концу линии, и перед точкой есть обратная косая черта, чтобы избежать ее, потому что обычно точка совпадает с чем угодно.

После этого осталось следующее:

\([^/]*\)

Глядя посередине мы имеем [^/] , который будет соответствовать одному символу ([] будет соответствовать одному из символов внутри квадратных скобок), который может быть все, что не является косой чертой, потому что ^ будет делать отрицаемое совпадение, так что ^/ внутри квадратных скобок "что-либо, кроме косой. После закрывающей квадратной скобки появляется звездочка * , что означает, что она будет совпадать с одним или несколькими символами внутри квадратных скобок.

Затем, обернувшись вокруг вышесказанного, мы имеем \( и \) , которые захватывают то, что соответствует в скобках и позволяют использовать их в разделе в s///, чтобы мы могли использовать их.

И затем в разделе мы имеем:

mydirectory\/\1.php/

Который заменит совпадающий rexecp на первый каталог/, косая черта, которую необходимо заменить, поскольку / используется в качестве разделителя для замены, и затем \1 используется для помещения в текст, который был захвачен в первой группе захвата, и затем добавим расширение .php в конце.


Все это вместе означает, что мы захватим все от последних / до .phtml ,добавьте каталог/ после последней косой черты, запишите захваченный текст, а затем добавьте расширение .php .

0
28.02.2015, 15:50
2 ответа

Так как тело awk находится в одинарных кавычках, awk не видит переменную оболочки. awk думает, что вы имеете в виду переменную awk i. Эта переменная неопределена, поэтому в числовом контексте она имеет нулевое значение. Таким образом, $i интерпретируется awk как $0, или как целая строка.

Вам нужно передать переменную оболочки в awk.

for ((i=1; i<=$count; i++))
do
    abc=$(awk -F "," -v col=$i 'NR==1 {print $col}' $file)
    #................^^^^^^^^^...............^^^^
    echo "$abc"
done

Однако, есть лучший способ, чем 3 раза вызывать awk:

while IFS=, read -ra fields; do
    printf "%s\n" "${fields[@]}"
    # or do stuff with the individual fields
    for ((i=0; i < ${#fields[@]}; i++)); do
        echo "${fields[i]}"
    done
done < "$file" 
  • цикл while, при котором содержимое файла перенаправляется в него, цикл поверх строк файла
  • IFS=, инструктирует команду read делать разбиение слов на запятые
  • read -r означает не интерпретировать никакие специальные символы как что-либо, кроме обычных символов в виде символов символов символов.
  • read -a fields reads words in the line into a array variable named fields
1
28.01.2020, 02:36

Вы используете abc=$(awk -F "," '(NR==1){print $($i)}'' $file). Здесь вы используете одинарные кавычки вокруг вашего скрипта awk. Поэтому переменные типа $i не заменяются на их значение.

Если i=1, то awk, таким образом, будет буквально видеть $($i) вместо $1, как показано во втором примере.

Вы можете дать переменные для awk, используя опцию -v.

Может быть, awk не является идеальным инструментом для данного задания. Я бы просто использовал

perl -wnle 'print for split ","'
1
28.01.2020, 02:36

Теги

Похожие вопросы