[HackerRank]uniq指令3(Uniq Command #3)

題目描述

輸入文字檔案內容,將有連續重複的那幾行縮減成一行。並在輸出的每行行首加上該行在縮減前的連續重複次數,使用一個空格字元將次數和該行資料隔開。判斷兩行文字是否重複請忽略英文字母大小寫,但是輸出時的英文大小寫要符合第一次出現時的文字。

原題網址

https://www.hackerrank.com/challenges/text-processing-in-linux-the-uniq-command-3

輸入格式

輸入一個文字檔案。

輸出格式

將輸入的資料輸出,但要將有連續重複的那幾行縮減成一行,並在輸出的每行行首加上該行在縮減前的連續重複次數,使用一個空格字元將次數和該行資料隔開。判斷兩行文字是否重複請忽略英文字母大小寫,但是輸出時的英文大小寫要符合第一次出現時的文字。

範例輸入

00
00
01
01
00
00
02
02
03
aa
AA
Aa

範例輸出

2 00
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」等所有空白字元。

參考答案

關於作者

Magic Len

Magic Len

各位好,我是Magic Len,是這網站的管理員。我是台灣台中大肚山上人,畢業於台中高工資訊科和台灣科技大學資訊工程系,曾在桃機航警局服役。我熱愛自然也熱愛科學,喜歡和別人分享自己的知識與經驗。如果你有興趣認識我,可以加我的Facebook,並且請註明是從MagicLen來的。

相關文章