Awk - произведите вторую строку многих .dat файлов в один файл

'Безопасно' удалить внешний диск, когда это размонтировано.

Причина не могло бы быть безопасно просто, если программы не используют его, состоит в том, что ядро Linux действительно пишет кэширование. При означании, что, когда программа записала в диск, что данные не могли бы физически быть на диске, это могло все еще быть в памяти (если программа не использует fsync или fdatasync). Linux делает это для выполнения записей на диск в больших блоках, который оптимизирует пропускную способность.

При размонтировании файловой системы она удостоверяется, что никакие дальнейшие записи не могут быть выполненными к диску. Это также выполняет a sync звоните, который гарантирует, что все кэшированные данные спугивают к диску.

8
06.01.2019, 15:26
6 ответов

Удалить в то время как цикл и использовать расширение оболочки скобы, а также FNR , встроенная awk переменная:

awk 'FNR==2{print $0 > "output.dat"}' file{1..80}.dat
17
27.01.2020, 20:08

sed будет достаточно:

sed -sn 2p file{1..80}.dat > output.dat

-s нужно вывести 2-ю строку из каждого файла, иначе будет выведена только 2-я строка из первого файла.

7
27.01.2020, 20:08

Попробуйте использовать ifdown tap_test и ifup tap_test вместо ifconfig .

Смысл в том, что если сделать еще немного работы. ifconfig голый минимум.

если ethX использует конфигурационный файл и вызывает интерфейс с правильным IP-адресом и т.д.

ifconfig ethX up запускает только интерфейс.

-121--146086-

Пробовали ли вы использовать mget с соответствующими подстановочными знаками, например mget *. * ? В качестве альтернативы рассмотрим не FTP-решение, такое как scp или rsync .

-121--246443-

Как насчет... head -n 2 input.dat | tail -n 1 | awk ...

6
27.01.2020, 20:08

Пробовали ли вы использовать mget с соответствующими подстановочными знаками, например mget *. * ? В качестве альтернативы рассмотрим не FTP-решение, такое как scp или rsync .

-121--246443-

Использование некоторых логических операторов (Начиная с @ jimmij)

grep -q «$ finding» information.txt ведет себя как логический ответ (при обнаружении ничего не имеет возвращаемого состояния 0, в противном случае ненулевое).

grp -F -- «$ finding»... поисковый текст вместо regexp (удалите его, если хотите искать regexp - могут быть некоторые угрозы безопасности... (спасибо @ StephanChazelas))

read finding

if [ -z "$finding" ]; then
   echo "You didn't enter anything"
else
   grep -qF -- "$finding" information.txt   && echo "found"   || echo "not found"
fi

или даже

[ -z "$finding" ] && 
     echo "nothing entered" || 
     grep -qF -- "$finding" information.txt || echo "not found"

(хотя остерегайтесь, чтобы он также запускал второй grep и/или echo , если первый echo не удался)

Edit 1 > пояснить grep -q... Конечно.

В обычных ситуациях состояние возврата grep равно 0 (и только возвращает «не 0», если возникает ошибка (например, файл не найден))

grep -qF exp файл «возвращает» 0 если он находит exp в файле, ошибка в противном случае ( grep -q exp файл будет делать это, если exp regexp был сопоставлен в файле ).

Это поведение можно использовать в операторах управления bash (if, elif, while, & &, | |, etc)

read f

if [ -z "$f" ]; then
   echo "You didn't enter anything"
elif grep -qF -- "$f" information.txt; then
   echo "found"
else
   echo "not found"
fi
-121--97763-

арагаер sed решение является самым хорошим, да. Но поскольку я получаю удовольствие от резания head 'tail , у меня есть решение head' tail , которое поддерживает несколько файлов, а не только один input.dat . Использование цикла for вместо передачи списка файлов в sed также облегчает выполнение других операций с файлом до/после извлечения второй строки с sed.

# empty output.dat first
rm output.dat

# have a one-liner
for file in *.dat; do head -2 $file | tail -1 >> output.dat; done 

Многострочная версия с исчерпывающим комментарием:

NB: будет выполняться следующий код. После | , & & или | мы можем установить линейную линию и продолжить выполнение команды на следующей строке; мы даже можем размещать комментарии между ними. Я провел лет , не зная этого (и нигде не видя). Этот стиль менее полезен в интерактивном запросе, но очищает файлы сценариев без конца.

# empty output.dat first
rm output.dat

for file in *.dat; do
    # file -> lines 1 and 2 of file
    head -2 $file |
    # lines 1 and 2 of file -> line 2 of file >> appended to output.dat
    tail -1 >> output.dat
done
2
27.01.2020, 20:08

, очевидно, есть много способов сделать это - я думаю, что мне нравится @ Aragaer's Sed Actions лучше всего .

Вот тот, который использует чисто Bash Shotins и не нужно вилять любые внешние утилиты:

for f in file{1..80}.dat; do
    { read && read && printf "%s\n" "$REPLY"; } < "$f"
done > output.dat
0
27.01.2020, 20:08

Для эффективного использования awkи sedв ответах здесь на несколько файлов лучше использовать оператор nextfile, чтобы пропустить обработку нежелательных строк в awk.

awk 'FNR==2{ print >"output.dat"; nextfile}' infile{1..80}.dat

и с помощью sedмы можем выйти при обработке на 3 й строке, и sedбудет обрабатывать следующий файл.

sed -sn '2p;3q' infile{1..80}.dat > output.dat
0
27.01.2020, 20:08

Теги

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