[英]awk/sed regex, extract a column that has the delimiter
我有一個具有這種格式的文件:這是名稱的開頭兩列數字,末尾兩列數字中間是一列,但名稱有一個空格分隔符,將事情弄亂了。
有什么我可以正確取出名稱列的正則表達式。 無論如何,我可以使用sed替換(或刪除)該列中的空間,以便我可以輕松地將該列取出來嗎?
例:
1 2 name 3 4
12 12 name1 name2 3 4
12 12 name1 name2 name3 name4 3 4
3 4 name 3 4
-我想要的輸出是:
name
name1_name2
name1_name2_name3_name4
name
謝謝,
阿米爾,
使用awk的一種解決方案是:
cat foo | awk '{ for(i=3; i<=NF-3; i++) { printf $i "_"; } printf $i "\n"; }'
這是使用sed的同一件事:
cat foo | sed -e 's/^[0-9 ]*//g' -e 's/ [0-9 ]*$//g' -e 's/ /_/g'
符合POSIX要求,以確保清晰:
cat foo | sed -e 's/^[[:digit:][:space:]]*//g' -e 's/[[:space:]]*[[:digit:][:space:]]*$//g' -e 's/ /_/g'
sed 's/^[0-9]\+ [0-9]\+ \(.*\) [0-9]\+ [0-9]\+$/\1/;s/ /_/g'
沒有循環的另一種awk方式
awk 'BEGIN{OFS="_"}{$1=$2=$NF=$(NF-1)="";gsub(/__/,"")}1' yourFile
測試 :
kent$ cat t
1 2 name 3 4
12 12 name1 name2 3 4
12 12 name1 name2 name3 name4 3 4
3 4 name 3 4
kent$ awk 'BEGIN{OFS="_"}{$1=$2=$NF=$(NF-1)="";gsub(/__/,"")}1' t
name
name1_name2
name1_name2_name3_name4
name
幾個Perl選項
perl -lne '/\d+ \d+ (.+) \d+ \d+/ and do {($_ = $1) =~ s/ /_/g; print}'
perl -lape 'for (1..2) {shift @F; pop @F}; $_ = join "_", @F'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.