題目描述
輸入文字檔案內容,將有連續重複的那幾行縮減成一行。並在輸出的每行行首加上該行在縮減前的連續重複次數,使用一個空格字元將次數和該行資料隔開。判斷兩行文字是否重複請忽略英文字母大小寫,但是輸出時的英文大小寫要符合第一次出現時的文字。
原題網址
輸入格式
輸入一個文字檔案。
輸出格式
將輸入的資料輸出,但要將有連續重複的那幾行縮減成一行,並在輸出的每行行首加上該行在縮減前的連續重複次數,使用一個空格字元將次數和該行資料隔開。判斷兩行文字是否重複請忽略英文字母大小寫,但是輸出時的英文大小寫要符合第一次出現時的文字。
範例輸入
00
00
01
01
00
00
02
02
03
aa
AA
Aa
00
01
01
00
00
02
02
03
aa
AA
Aa
範例輸出
2 00
2 01
2 00
2 02
1 03
3 aa
2 01
2 00
2 02
1 03
3 aa
額外解釋
00連續出現了兩次,01連續出現了兩次。接著還是00,它又連續出現了兩次。然後02也又連續出現了兩次。緊接著的03只出現一次,最後aa、AA或Aa連續出現了三次。
解題概念
「uniq」指令可以用來縮減從標準輸入中進來的文字資料,並輸出至標準輸出中。在預設的情況下,「uniq」指令會將有連續重複的那幾行縮減成一行。「-c」選項可以讓「uniq」指令在各行不連續重複的行首輸出其在縮減前的連續出現次數,次數會佔7個字元,數值位數不足的話會使用空格字元來隔開,次數和該行資料會以一個空格字元來區隔。「-i」選項可以忽略英文字母大小寫。
為了要修剪(trim)「uniq」指令的各行輸出的前後空格字元,所以將「uniq」指令的輸出使用管線作為「sed」指令的輸入。為了要完成「trim」的功能,「sed」指令必須要能將字串前面和字串後面的連續空格取代成空字串,因此命令稿可以寫成「s/^[[:space:]]*//;s/[[:space:]]*$//」,「[:space:]」代表「 \t\v\f」等所有空白字元。
參考答案
#/bin/bash
uniq -c -i | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'