Как использовать двойную замену в awk?

Открыть терминал (ALT + F2).

Введите sudo -i в поле ввода. Проверьте параметр Run in terminal. Наконец, нажмите кнопку «Выполнить».

Введите пароль, если необходимо, и нажмите enter. Затем введите следующие команды:

gedit /etc/hosts

Вы получите окно редактора Gedit Text Editor.

Например, если нам нужно заблокировать Facebook, добавьте следующие строки сразу после 127.0.0.1 localhost.

0.0.0.1 facebook.com    
0.0.0.1 www.facebook.com

Делая это, он блокирует сайт во всех браузерах, включая Google Chrome, Chromium, Mozilla.

Вот и все. Когда вы сейчас открываете сайт www.facebook.com или facebook.com, вы не можете получить к нему доступ. Чтобы включить обратно Facebook, удалите строки, которые мы добавили из файла /etc/hosts.

Источник - блог Субина

1
задан 21 April 2015 в 14:22

2 ответа

Выбранная вами переменная x="\$$y" недоступна в подоболочках <(...). Это проблема. Используйте export, чтобы сделать его доступным в последующих выполненных командах, но в любом случае он будет расширен родительской оболочкой. Подсвечники никогда не видят эту переменную, но вместо этого видят значение, замененное родительской оболочкой. Как заметил @EliahKagan в комментариях.

Также ваш awk может быть немного проще. См. Пример (я использовал echo для имитации файла с двумя полями):

x=2
paste <(echo "a1,a2" | awk -F, '{print $'$x'}' ) <(echo "b1,b2" | awk -F, '{print $'$x'}')

Тогда вывод будет:

a2      b2
3
ответ дан 23 May 2018 в 21:11
  • 1
    Это сработало. Спасибо @chaos – Ramana Reddy 21 April 2015 в 15:12
  • 2
    Хорошая точка: подоболочки, +1 – A.B. 21 April 2015 в 15:23
  • 3
    @chaos Вы пробовали свой пример без export (т. е. только x=2 вместо export x=2)? Это тоже работает. $x расширяется родительской оболочкой; подоболочки никогда не видят текст $x, но вместо этого видят значение, замененное его родительской оболочкой. – Eliah Kagan 21 April 2015 в 15:41
  • 4
    @EliahKagan Спасибо за разъяснение, я протестировал его, он тоже работает и отредактировал ваше дополнение к ответу. – chaos 21 April 2015 в 19:45
  • 5
    @chaos Спасибо за редактирование, но этот ответ по-прежнему очень запутан, и я все еще не уверен, что ваше объяснение проблемы совершенно правильно. Действительно ли проблема в том, что переменная оболочки недоступна в подоболочках? Я рекомендую для дальнейшего редактирования. В частности, независимо от того, доступна ли переменная в подоболочке, не имеет значения приведенный вами пример. Я не вижу, как это относится к коду OP - так, если это так, я рекомендую объяснить это конкретно. – Eliah Kagan 22 April 2015 в 16:25

Использование bash:

#!/bin/bash
paste PreRefFile.csv Txlog.csv | while IFS=$'\t' read a b; do
  i=29
  while [[ $i -le 189 ]]; do
    printf "$(cut -d, -f$i<<<"$a")\t$(cut -d, -f$i<<<"$b")\n"
    i=$((i+1))
  done
done

Используя python:

#!/usr/bin/env python2
import csv, itertools
with open('PreRefFile.csv') as a, open('PreRefFile.csv') as b:
    for i, j in itertools.izip_longest(csv.reader(a), csv.reader(b)):
        check = 28
        while check <= 188:
            print i[check] + '\t' + j[check]
            check += 1
2
ответ дан 23 May 2018 в 21:11

Другие вопросы по тегам:

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