См., что страница справочника для даты управляет и смотрит на-d опцию:
% date -d '+1 day'
Mon Jul 15 21:51:06 PDT 2013
% date
Sun Jul 14 21:51:16 PDT 2013
%
Я также предложил бы работать:
info date
для более явной информации.
Возможное решение awk
может быть :
awk 'BEGIN { RS = ""; } { $1 = $1; } 1' matrices.txt > modified_matrices.txt
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
разные стандарты в разных системах.
$ 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 читать весь файл как одну строку, тогда это будет менее подходящим для больших входных файлов.
Вы можете сделать это с помощью небольшого сценария 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
В 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
, чтобы объединить все матрицы, разделенные новой строкой:
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