2014-03-29 14 views
152

最後一個字段不使用sedawk只有cut,我如何才能最後一個字段時,字段的數量是未知的或與每行改變?如何找到使用「切割」

+0

您不能。爲什麼你必須使用'cut'? – tom

+12

看起來你正在做家庭作業問題。這裏的人熱愛幫助,但爲了在生活中取得真正的成功,你可能需要嘗試各種各樣的事情,並用已經嘗試過的證據明智地提出問題。 – zedfoxus

+5

你是否愛上'cut'命令:)?爲什麼不使用其他Linux命令? –

回答

358

你可以嘗試這樣的事:

echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev 

說明

  • maps.google.com的反向將moc.elgoog.spam
  • cut使用點作爲分隔符,並選擇第一場,這是moc
  • 最後,我們轉erse it again(謝謝提醒,@tom)com
+0

這是「只有'剪切」「? – tom

+3

它不是隻使用'cut',而是沒有'sed'或'awk'.So是什麼意思? –

+5

@tom在過去的幾個小時裏,OP已經提出了比這更多的問題。基於我們與OP的交互,我們知道awk/sed /等。他的作業是不允許的,但是沒有提到rev。所以這是值得的拍攝 – zedfoxus

57

這是不可能的只使用cut。以下是使用grep的一種方法:

grep -o '[^,]*$' 

替換其他分隔符的逗號。

+2

做相反的事情,找到除最後一個字段之外的所有內容:grep -o'^。*,'' – Ariel

+0

這是特別有用的,因爲'rev'在我的情況下添加一個問題多字節unicode字符。 – Brice

78

使用參數擴展。這比任何外部命令cut(或grep)都要高效得多。

data=foo,bar,baz,qux 
last=${data##*,} 

請參閱BashFAQ #100瞭解bash中本地字符串操作的介紹。

+7

這不是最有價值的答案嗎?! :-) –

+3

@ErwinWessels:因爲bash真的很慢。使用bash運行管道,而不是批量處理數據。我的意思是,如果你已經在一個shell變量中有一行文本,或者你想'while IFS = read -ra array_var; do:; done <(cmd)'來處理幾行。但是對於一個大文件,rev | cut | rev可能更快! (當然awk會比這更快。) –

+1

@PeterCordes,當然,對於大文件來說,awk會更快,但需要一點點輸入來克服恆定因素的啓動成本。 (還有一些shell - 比如ksh93 - 性能更接近awk,在這個答案中給出的語法仍然有效; bash特別緩慢,但它甚至不接近唯一可用的選項)。 –

0

如果你有一個名爲Filelist.txt中該文件是一個列表的路徑如下所示: C:/dir1/dir2/file1.h C:/dir1/dir2/dir3/file2.h

然後你可以這樣做: rev filelist.txt |剪下-d「/」-f1 | rev

11

有多種方式。你也可以使用它。

echo "Your string here"| tr ' ' '\n' | tail -n1 
> here 

顯然,tr命令的空格輸入應該用您需要的分隔符替換。

+0

謝謝!在busybox sh 1.0.0中有效:) – kevinf

+1

這對我來說就像是最簡單的答案,管道更少,意思更清晰 – joeButler

+1

對於整個文件來說,這是行不通的,這是OP的意思。 – Amir

5

這是唯一的解決辦法可能只是用普通的髮型:

回聲「s.t.r.i.n.g.」 |切「-d」。 -f2- [repeat_following_part_forever_or_until_out_of_memory:] |切「-d」。 -f2-

使用此解決方案時,字段的數量確實可能是未知數,並且會隨時變化。但是,由於行長度不得超過LINE_MAX個字符或字段(包括換行符),因此任意數量的字段不能作爲此解決方案的真實條件。

是的,一個非常愚蠢的解決方案,但唯一符合我認爲的標準。

+1

不錯。只要拿最後一個'。'關閉「s.t.r.i.n.g.」這工作。 – Matt

+2

當大家都說有些事情是不可能的時候,我喜歡這樣,然後有人用一個有效的答案給出答案。即使這確實很愚蠢。 – Beejor

0

以下工具A friend's suggestion

#!/bin/bash 
rcut(){ 

    nu="$(echo $1 | cut -d"$DELIM" -f 2- )" 
    if [ "$nu" != "$1" ] 
    then 
    rcut "$nu" 
    else 
    echo "$nu" 
    fi 
} 

$ export DELIM=. 
$ rcut a.b.c.d 
d 
+0

爲了使此功能可靠且穩健地工作,您需要在'echo'參數周圍加雙引號。請參閱https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable – tripleee

6

沒有AWK ... 但它的使用awk這麼簡單:

echo 'maps.google.com' | awk -F. '{print $NF}' 

AWK是一種更強大的工具,在你的口袋裏。 -F如果是字段分隔符 NF是字段的數量(也代表最後的索引)