Используя цикл в CSV-файле, создайте отдельный файл для каждой строки

Да, возможно (могут возникнуть сложности в зависимости от языка более высокого уровня и того, насколько хорошо он позволяет выбирать такие детали ).

#!/usr/bin/env expect
set port 1234
proc v4 {fh caddr cport} { puts $fh v4; close $fh }
proc v6 {fh caddr cport} { puts $fh v6; close $fh }
socket -myaddr 127.0.0.1 -server [list v4] $port
socket -myaddr ::1 -server [list v6] $port
vwait godot

С этим бегом:

% lsof -i -nP | grep 1234
expect 96688 jhqdoe 10u IPv4 0xf7... 0t0 TCP 127.0.0.1:1234 (LISTEN)
expect 96688 jhqdoe 11u IPv6 0xf7... 0t0 TCP [::1]:1234 (LISTEN)
% nc 127.0.0.1 1234
v4
% nc ::1 1234
v6
1
30.12.2020, 10:22
2 ответа

С awkи при условии, что вы хотите писать код на языке shи это простой csv без полей в кавычках, полей со встроенными запятыми или символами новой строки:

LC_ALL=C awk -F, -v q="'" '
  function shquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  {
    file = $1".txt"
    print "grep -e "shquote($3)" < "shquote($2) > file
    close(file)
  }' < file.csv

Вместо cat b | grep cэто делает grep -e 'c' < 'b'как:

  1. Не имеет смысла объединять один файл. Здесь вы можете сделать grepstdin файлом напрямую, следовательно, перенаправить вместо того, чтобы передавать вывод cat.
  2. Строки заключаются в кавычки, чтобы избежать проблем с символами, которые являются специальными в синтаксисе оболочки.
  3. Использование grep -e regexpвместо grep regexp, чтобы избежать проблем с регулярными выражениями, начинающимися с -.
1
18.03.2021, 22:40
awk -F "," '{print "touch "$1".txt"";""echo cat "$2"|grep "$3"> "$1".txt"}' CSVfilename| sed 's/cat/"&/g'| sed 's/>/"&/g'|sh

Проверено, работает нормально

0
18.03.2021, 22:40

Теги

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