На Linux Вы, вероятно, уже имеете tmpfs
файловая система, в которую можно записать в /dev/shm
.
$ >/dev/shm/foo
$ df /dev/shm/foo
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 224088 0 224088 0% /dev/shm
Это может использовать подкачку, как бы то ни было. Для истинного электронного диска (который не подкачает), необходимо использовать ramfs
файловая система.
mount ramfs -t ramfs /mountpoint
sed:
sed '2,$s/^\("[^"]*","\)/\1'"'"/ test.in
Используя EREs для избавлений от части выхода:
sed -E '2,$s/^("[^"]*",")/\1'"'"/ test.in
awk:
awk -F, 'NR>1{sub(/^"/,"\"'"'"'",$2)}1' test.in
Если Вы не хотите волноваться о заключении в кавычки, используйте управляющий код:
awk -F, '{sub(/^"/,"\"\x27",$2)}1' test.in
Использование Perl:
perl -pi -e '
BEGIN{
$column_number = 2; # Change as needed
$column_number--;
$apostrophe = chr 39;
}
next unless $this_is_data++; # Skip the first line
s@ ^((?:"[^"]+"\s*,){$column_number}) "@$1"$apostrophe@x
' your_file
Это предполагает, что Ваши поля не содержат оставленные из обратной косой черты кавычки.
Вот простофиля один:
$ gawk -F'","' -v var="'" -v OFS='","' 'NR>1{$2=var$2;} 1' foo.csv
-v
опция позволяет Вам определить переменные, которые доступны для gawk
сценарий. В этом случае, var
'
и OFS
(выходной разделитель полей), ","
, то же как разделитель поля ввода (-F
). Мы затем проверяем, что это не первая строка (NR>1
) и добавьте значение var
к второму столбцу. Наконец, 1
просто прием, он оценивает к истинному, который делает gawk
распечатайте строку. Это эквивалентно добавлению a print;
но короче.
Если Вы хотите выполнить это на другом столбце, просто измениться $2=var$2;
кому: $N=var$N
где N
номер столбца, которым Вы интересуетесь.
Можно также сделать это в жемчуге (естественно, можно сделать все в жемчуге):
$ perl -F'\",\"' -ane '$.>1 && do{$F[1]=chr(39).$F[1]};
print join("\",\"",@F)' foo.csv
-a
переключатель делает входные строки разделения жемчуга как простофиля только, что он сохраняет их в массиве @F
(массивы жемчуга запускаются от 0, таким образом, 2-й столбец будет $F[1]
, 3-е $F[2]
и т.д.). -F
(снова как gawk
) устанавливает разделитель поля ввода. Так, мы проверяем, больше ли номер строки, чем один ($.>1
) и если это, добавьте значение chr 39
(a '
, спасибо @josephR), к нему. Наконец мы используем join
соединить каждый элемент в массиве @F
с ","
и распечатайте получившую строку.
2,$
поскольку Kevin имеет.
– terdon♦
23.10.2013, 21:34
-F'","'
и join("\",\""...
как Вы выполнили gawk
?
– Joseph R.
23.10.2013, 21:52
"
для -F
и это просто стало слишком сложным. Это перестанет работать, если OP будет иметь кавычки в полях (и он делает на основе своих других вопросов), но эй, который не был упомянут здесь :). Между прочим, я бесстыдно украл char 39
от Вас надежда Вы не возражаете.
– terdon♦
23.10.2013, 21:57
Простое sed
сделаю:
$ sed 's/","/","\x27/' afile
"col1","'col2","col3","col4","col5"
"value11","'value12","value13","value14","value15"
"value21","'value22","value23","value24","value25"
"value31","'value32","value33","value34","value35"
Мы ищем первое вхождение ","
и замена его с ","`
. Однако выход обратной галочки может быть хитрым. Поэтому просто поместите его шестнадцатеричный эквивалентный управляющий код, \x27
.
Это может быть адаптировано как так для ограничения изменений в просто строках, которые Вы хотите.
$ cat <(head -n +1 afile) <(tail -n +2 afile | sed 's/","/","\x27/')
"col1","col2","col3","col4","col5"
"value11","'value12","value13","value14","value15"
"value21","'value22","value23","value24","value25"
"value31","'value32","value33","value34","value35"
Или можно пропустить первую строку полностью, с помощью sed
если Вы знаете прием 8-):
$ sed '2,$s/","/","\x27/' afile
"col1","col2","col3","col4","col5"
"value11","'value12","value13","value14","value15"
"value21","'value22","value23","value24","value25"
"value31","'value32","value33","value34","value35"
Это говорит sed
проводить только 2-ю строку до последней строки ($
) и выполненный те, которые посредством поиска и замены.
2,$
.
– slm♦
23.10.2013, 21:36