2014-01-21 267 views
1

我剛剛進入shell腳本並在過去2個月中學習它。我需要你幫助調整或提供任何其他解決方案,無論是在sed或AWK下面的問題。在shell腳本中需要幫助

「編寫一個腳本來輸入文件名並以每行只有10個字符的方式顯示文件內容。如果文件中的行超過10個字符,則在下一行顯示該行的其餘部分。

我寫了下面的腳本,工作正常。但是花了2個小時才寫出來......(肯定不能接受)問題是我知道shell命令非常好,但仍然沒有掌握將它們放到shell腳本中的技巧:-(。謝謝。

#!/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'用法:$ 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

非常感謝哈希布朗。這太棒了。我還閱讀了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

我得到這樣一個很好的答案。謝謝。如果(i%10 == 0)printf「%s \ n」,$ i;請問你能解釋一下這個f =否則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