簡體   English   中英

如何使用awk打印一系列單詞?

[英]How to print a series of words using awk?

我知道awk只能用來打印輸出中的某些單詞。

dpkg -l|awk '{print $2}'

將從dpkg -l的輸出中輸出第二個單詞。

我要做的是在給定單詞之后打印每個單詞。我的命令如下所示

awk '{printf "%-40s %s\n", $1, $n}'

而不是打印所有帶有$n$0的單詞,我想打印之后的每個單詞,例如第5個字符。

我怎樣才能做到這一點?

編輯 :我完整的命令是

bind -P|grep "can be found"|sort|awk '{printf "%-40s %s\n", $1, $n}'

這給出了類似的輸出

abort                                    abort can be found on "\C-g", "\C-x\C-g", "\e\C-g".
accept-line                              accept-line can be found on "\C-j", "\C-m".
backward-char                            backward-char can be found on "\C-b", "\eOD", "\e[D".
backward-delete-char                     backward-delete-char can be found on "\C-h", "\C-?".

character-search-backward                character-search-backward can be found on "\e\C-]".
character-search                         character-search can be found on "\C-]".
clear-screen                             clear-screen can be found on "\C-l".

還有更多行。 “可以在其中找到中止”並且類似的行無關緊要,我不要它們,但我希望在這5個字符之后輸入所有內容。

所以輸出應該像

abort                                    "\C-g", "\C-x\C-g", "\e\C-g".
accept-line                              "\C-j", "\C-m".
backward-char                            "\C-b", "\eOD", "\e[D".
backward-delete-char                     "\C-h", "\C-?".

如何使用awk或任何其他命令執行此操作? 我需要保留列狀輸出。

請嘗試以下方法:

 many commands | awk '{for(i=6;i<=NF;i++){printf "%s\n", $i}}'

如果您不希望換行符分隔下面的每個單詞,將打印從字段6開始的所有內容:

many commands | awk '{for(i=6;i<=NF;i++){printf "%s ", $i}}'

編輯:

對於完整的問題,請在下面使用:

 bind -P|grep "can be found"|sort | awk '{printf "%-40s", $1} {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}'

給出輸出:

abort                                   "\C-g", "\C-x\C-g", "\e\C-g".
accept-line                             "\C-j", "\C-m".
backward-char                           "\C-b", "\eOD", "\e[D".
backward-delete-char                    "\C-h", "\C-?".
backward-kill-line                      "\C-x\C-?".
etc...

在這種情況下,請使用更好的工具,例如perl:

perl -lne 'print $1 if(/\b(myword .*)/)'

不確定您要尋找什么。 但這會刪除該行中的前5個單詞:

awk '{for(i=6;i<=NF;i++){printf $i" "}print ""}'

經測試

如果需要顯式使用AWK,可以嘗試以下操作:

awk '{ if( match($0,"^.{5}[^[:space:]]*[[:space:]]([^[:space:]]+)(:?$|[[:space:]])", arr) ) {print arr[1]}}'

匹配功能可確保在開始捕獲單詞之前至少有5個字符(空白和字母數字)。 如果第五個字符之后的下一個元素是單詞的中間部分,則它只會忽略它,然后轉到下一個完整的單詞並捕獲它。 arr中的第一個位置對應於正則表達式中的捕獲元素,它是第五個字符之后的第一個完整單詞。

保存第一個字段。 作為條件/模式,嘗試將空字符串替換為“。*可以在”上找到。 如果發生替換,請打印保存的第一個字段以及$ 0的剩余值。

bind -P | awk '{ first = $1 } sub(/.*can be found on /, "") { printf "%-40s%s\n", first, $0 }

在您的原始版本中:

bind -P | grep“可以找到” | sort | awk'{printf“%-40s%s \\ n”,$ 1,$ n}'$ n中的n等於0,因此awk同時打印第一個單詞和整個記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM