我有這條線
UDACBG UYAZAM DJSUBU WJKMBC NTCGCH DIDEVO RHWDAS
我正在嘗試使用awk命令列印每個單詞的最后一個字母以創建一個字串
awk '{ print substr($1,6) substr($2,6) substr($3,6) substr($4,6) substr($5,6) substr($6,6) }'
如果我不知道一個單詞包含多少個字符,列印 $column 最后一個字符的正確命令是什么,而不是重復substr命令,我如何只使用一次來列印不同列中的特定字符
uj5u.com熱心網友回復:
如果您只有這一行來處理,您可以使用
awk '{for (i=1;i<=NF;i ) r = r "" substr($i,length($i))} END{print r}' file
如果輸入中有多行:
awk '{r=""; for (i=1;i<=NF;i ) r = r "" substr($i,length($i)); print r}' file
詳情:
{for (i=1;i<=NF;i ) r = r "" substr($i,length($i))- 迭代當前記錄中的所有欄位,i是欄位 ID,$i是欄位值,并且每個欄位的所有最后一個字符(用 檢索substr($i,length($i)))都附加到r變數END{print r}腳本完成處理后列印r變數awk。- 第二種方案,
r每行開始處理時清零值,處理完當前記錄的所有欄位后列印其值。
請參閱在線演示:
#!/bin/bash
s='UDACBG UYAZAM DJSUBU WJKMBC NTCGCH DIDEVO RHWDAS'
awk '{for (i=1;i<=NF;i ) r = r "" substr($i,length($1))} END{print r}' <<< "$s"
輸出:
GMUCHOS
uj5u.com熱心網友回復:
使用 GNU awk 和gensub:
$ gawk '{print gensub(/([^ ] )([^ ])( |$)/,"\\2","g")}' file
輸出:
GMUCHOS
uj5u.com熱心網友回復:
第一個解決方案:使用 GNU,awk您可以嘗試以下awk程式,撰寫并測驗所示示例。
awk -v RS='.([[:space:]] |$)' 'RT{gsub(/[[:space:]] /,"",RT);val=val RT} END{print val}' Input_file
說明:將記錄分隔符設定為任何字符后跟空格或值/行的結尾。然后根據 OP 的要求從獲取的值中洗掉不必要的換行符/空格;繼續創建與 RS 值匹配的 val,最后當awk程式完成讀取整個 Input_file 時列印變數的值。
第二種解決方案:使用記錄分隔符作為空值并使用match值的函式來匹配正則運算式(.[[:space:]] )|(.$)以僅在找到每個匹配項時獲取最后一個字母值,繼續將匹配的值添加到變數中,最后在awk程式列印變數值的END 塊中。
awk -v RS= '
{
while(match($0,/(.[[:space:]] )|(.$)/)){
val=val substr($0,RSTART,RLENGTH)
$0=substr($0,RSTART RLENGTH)
}
}
END{
gsub(/[[:space:]] /,"",val)
print val
}
' Input_file
uj5u.com熱心網友回復:
單行上的簡單替換是 sed 存在的作業:
$ sed 's/[^ ]*\([^ ]\) */\1/g' file
GMUCHOS
uj5u.com熱心網友回復:
使用許多工具
$ tr -s ' ' '\n' <file | rev | cut -c1 | paste -sd'\0'
GMUCHOS
將單詞分隔為行,反轉以便我們可以輕松選擇第一個字符,最后將它們粘貼在一起而不使用分隔符。不是最短的解決方案,但我認為最簡單的解決方案......
uj5u.com熱心網友回復:
GNU awk 的另一種方法是FPAT用于拆分和保留內容:
gawk 'BEGIN{FPAT="\\S\\>"}
{ s=""
for (i=1; i<=NF; i ) s=s $i
print s
}' file
GMUCHOS
或者更簡潔和慣用的:
gawk 'BEGIN{FPAT="\\S\\>";OFS=""}{$1=$1}1' file
GMUCHOS
(為此感謝 Daweo )
您還可以將 gensub 用于:
gawk '{print gensub(/\S*(\S\>)\s*/,"\\1","g")}' file
GMUCHOS
兩者的優點是可以正確處理單個字母“單詞”:
s2='SINGLE X LETTER Z'
gawk 'BEGIN{FPAT="\\S\\>";OFS=""}{$1=$1}1' <<< "$s2"
EXRZ
gawk '{print gensub(/\S*(\S\>)\s*/,"\\1","g")}' <<< "$s2"
EXRZ
接受的答案和大多數這里沒有:
awk '{for (i=1;i<=NF;i ) r = r "" substr($i,length($1))} END{print r}' <<< "$s2"
ER # WRONG
gawk '{print gensub(/([^ ] )([^ ])( |$)/,"\\2","g")}' <<< "$s2"
EX RZ # WRONG
uj5u.com熱心網友回復:
我將為此利用 GNU AWK,如下所示,讓file.txt內容成為
UDACBG UYAZAM DJSUBU WJKMBC NTCGCH DIDEVO RHWDAS
然后
awk 'BEGIN{FPAT="[[:alpha:]]\\>";OFS=""}{$1=$1;print}' file.txt
輸出
GMUCHOS
說明:通知 AWK 處理詞尾的任何字母字符,并使用空字串作為輸出欄位分隔符。$1=$1用于觸發使用指定的行重建OFS。如果您想了解更多關于單詞開始/結束的資訊,請閱讀GNU Regexp Operators。
(在 gawk 4.2.1 中測驗)
uj5u.com熱心網友回復:
GNU 的另一個解決方案awk:
awk '{$0=gensub(/[^[:space:]]*([[:alpha:]])/, "\\1","g"); gsub(/\s/,"")} 1' file
GMUCHOS
gensub()在這里獲取字符并gsub()洗掉它們之間的空格。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336639.html
