2014-01-21 4 views
1

Я новичок в сценариях оболочки и изучаю его за последние 2 месяца. Мне нужна ваша помощь в настройке или предоставлении любого другого решения в sed или AWK для нижеописанного вопроса.Нужна помощь в скрипте оболочки

«написать сценарий для ввода имени файла и отображения содержимого файла таким образом, чтобы каждая строка имела только 10 символов. Если строка в файле превышает 10 символов, тогда отобразите остальную часть строки в следующей строке».

Я написал сценарий ниже и отлично работал. Но мне потребовалось 2 часа, чтобы написать его .. (конечно, не приемлемо). Проблема в том, что я очень хорошо знаю команды оболочки, но до сих пор не освоил навыков, чтобы поместить их в сценарии оболочки :-(Спасибо.

#!/bin/bash 

if [ $# -ne 1 ]; then 
echo "USAGE: $0 $1" 
exit 99; 
fi 

VAR1=$(echo "$1" | wc -c) 

cat "$1" | while read line 
     do 
      [ $VAR1 -gt 10 ] && echo "$line" || echo "$line"|tr " " "\n" 
     done 
+1

Это хорошо, что вы сообщаете обычая. Однако, поскольку нет '$ 1', пользователь не будет знать, что они должны ввести. Похоже, эхо должно быть: 'echo 'Usage: $ 0 filename"> & 2', где 'Usage' обычно пишется в смешанном случае, а выход для сообщения об ошибке должен идти на стандартную ошибку, а не на стандартный вывод. –

+0

Я немного озадачен. Значение в '$ VAR1' - это количество символов в имени файла. Код в теле цикла является непостижимым (используйте регулярный 'if/then/else', если вы хотите написать однострочные, перейдите и изучите APL). Если имя файла длиннее 10 символов, вы повторяете строку без изменений; в противном случае вы эхо-строки заменяете пробелы новыми символами. Я не уверен, что очень точно соответствует спецификации. –

ответ

1

Использование sed

sed 's/........../&\n/g' file.txt 

Использование grep

grep -oE '.{1,10}' file.txt 

Использование dd

cat file.txt | dd cbs=10 conv=unblock 2>/dev/null 
+0

Большое спасибо hashbrown. это круто. Я также прочитал руководство sed и получил другое решение - sed -r 's/^. {10}/& \ n/g' filename.txt. Он отлично работает в Linux, не уверен, будет ли он работать в любом другом стиле unix. –

+0

@ krishnamurti да, это должно работать в большинстве новых версий 'sed' – hashbrown

0

awk?

awk 'BEGIN {FS=""} {for (i=1; i<=NF; i++) if (i % 10 == 0) printf "%s\n", $i ; else if (i == NF) print "\n" ; else printf "%s", $i} ' inputs.txt 

Это работает, но у меня есть ощущение, что это не самый оптимальный способ использования AWK :-P

+0

Я получаю такие замечательные ответы. Благодарю. не могли бы вы объяснить эту f = часть для меня: if (i% 10 == 0) printf "% s \ n", $ i; else if (i == NF) напечатать "\ n"; else printf "% s", $ i}. Из того, что я понял, он проверит, есть ли какие-либо символы в месте 10, затем напечатайте новую строку иначе, если она равна количеству полей, затем (не поняла), иначе просто напечатайте строку. –

+0

+1. Я начинаю с 'BEGIN {FS =" "}' - это означает, что каждый символ будет считаться одним символом (даже пробелы). Что касается петли for; 'i' будет представлять количество символов, а' $ i' будет представлять символ. 'if (i% 10 == 0) printf"% s \ n ", $ i' - если число, деленное на 10, имеет остаток 0 (т. Е. Каждый десятый символ), напечатайте символ плюс новую строку. 'else if (i == NF) print" \ n "' - если count является последним символом строки, напечатайте новую строку. 'else printf"% s ", $ i}' - для всего остального (т. Е. Не десятого символа или конца строки), напечатайте символ. – csiu

Смежные вопросы