Преобразование матриц в отдельные строки данных

См., что страница справочника для даты управляет и смотрит на-d опцию:

 % date -d '+1 day'
 Mon Jul 15 21:51:06 PDT 2013
 % date
 Sun Jul 14 21:51:16 PDT 2013
 %

Я также предложил бы работать:

 info date

для более явной информации.

4
25.08.2015, 21:25
6 ответов

Возможное решение awk может быть :

awk 'BEGIN { RS = ""; } { $1 = $1; } 1' matrices.txt > modified_matrices.txt
4
27.01.2020, 20:49
  • С помощью tr и sed :

Замените все символы новой строки хешами (выберите любой другой символ, которого нет в ваших матрицах, если у вас есть хеши), тогда двойные хеши будут быть символами новой строки и одиночными просто пробелами: (GNU sed )

 tr '\n' '#'  <file  | sed 's/##/\n/g;s/#/ /g'

POSIX sed

 tr '\n' '#'  <file  | sed 's/##/\
 /g;s/#/ /g'
  • Относительно размера файла:

Возможно, вы также захотите разбить файл на матрицу блоки - отдельный файл для каждого, затем объедините их заново. Обратите внимание, что это много операций чтения / записи, и их следует учитывать только в том случае, если другие решения выходят за рамки вашей оперативной памяти.

csplit -b%04d -f file file '/^$/' '{*}'

Т.е. разделить файл на файлы с именами fileXXXX с непрерывным целым числом XXXX , в качестве маркера разделения использовать пустые строки '/ ^ $ /' ; делать на все случаи жизни '{*}' . Теперь воссоедините файлы по частям с помощью сценария оболочки:

for f in file???? ; do 
  sed '/^$/d' $f | tr '\n' ' ' >> newmatrices
done

I.e. удалите пустые строки, которые мы использовали в качестве маркеров разделения раньше, затем tr замените символы новой строки на пробелы и добавьте каждую строку в выходной файл newmatrices .

Конечно, и разделение, и воссоединение можно поместить в один сценарий.

Обратите внимание, что мне неизвестно, используются ли csplit разные стандарты в разных системах.

1
27.01.2020, 20:49

Другой однострочный:

$ sed -rz 's/\n([^\n])/ \1/g;s/\n /\n/g' matrices.txt
1 2 3 4 2 3 4 5 3 4 5 6
3 4 5 6 2 3 2 5 2 3 4 5 2 3 5 6 2 3 4 5
$ 

Потому что -z фактически заставляет sed читать весь файл как одну строку, тогда это будет менее подходящим для больших входных файлов.

0
27.01.2020, 20:49

Вы можете сделать это с помощью небольшого сценария bash:

$ cat data
1 2 3 4
2 3 4 5
3 4 5 6

3 4 5 6
2 3 2 5
2 3 4 5
2 3 5 6
2 3 4 5

$ cat foo.sh
#!/bin/bash

while read line; do
    if [[ "${line}" = "" ]]; then
        echo ""
    else
        echo -n "${line} "
    fi
done
echo ""

$ bash foo.sh < data
1 2 3 4 2 3 4 5 3 4 5 6
3 4 5 6 2 3 2 5 2 3 4 5 2 3 5 6 2 3 4 5
1
27.01.2020, 20:49

В Vi / Vim вы можете просто запустить:

:%j

, чтобы объединить все строки вместе, или:

:%v/^$/-1j

, чтобы объединить все матрицы, разделенные новой строкой ( Соединение строк между определенным текстовым шаблоном в Vim ).

Если вам нужно сделать это из командной строки, попробуйте либо:

ex -s +%j +"wq modified_matrices.txt" matrices.txt

, чтобы объединить все строки, либо:

ex -s +'%v/^$/-1j' +'wq! modified_matrices.txt' matrices.txt

, чтобы объединить все матрицы, разделенные новой строкой:

2
27.01.2020, 20:49

sed only:

sed '/^$/!{H;$!d;};x;s/.//;y/\n/ /' infile > outfile

This accumulates non-empty lines in the hold space and deletes them if not the last line else it exchanges buffers, removes the leading newline and translates all newlines to spaces.
With blocks separated by an arbitrary number of empty lines, to collapse them into a single one:

sed '/^$/!{         # if line isn't empty
H                   # append to hold space
$!d                 # if it's not the last line, delete it
b end               # branch to label end (this happens only if on the last line)
}
//b end             # if line is empty, branch to label end
: end               # label end
x                   # exchange pattern space w. hold space
//d                 # if pattern space is an empty line, delete it; else
s/\n//              # remove the leading \newline
s/\n/ /g            # replace all remaining \newline chars with spaces
' infile > outfile

or, as a one-liner:

sed '/^$/!{H;$!d;$b end;};//b end;: end;x;//d;s/\n//;s/\n/ /g' infile > outfile
1
27.01.2020, 20:49

Теги

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