Linux

將單獨的行轉換為帶有引號的條目的逗號分隔列表

  • September 15, 2020

我有以下數據(從 Rmarkdown 文件解析的 R 包列表),我想將其轉換為可以傳遞給 R 進行安裝的列表:

d3heatmap
data.table
ggplot2
htmltools
htmlwidgets
metricsgraphics
networkD3
plotly
reshape2
scales
stringr

我想將列表轉換為表單列表:

'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'

我目前有一個從原始文件到上面列表的 bash 管道:

grep 'library(' Presentation.Rmd \
| grep -v '#' \
| cut -f2 -d\( \
| tr -d ')'  \
| sort | uniq

我想添加一個步驟以將新行轉換為逗號分隔列表。我試過添加tr '\n' '","',但失敗了。我還嘗試了以下一些 Stack Overflow 答案,但也都失敗了:

這產生library(stringr)))phics)了結果。

這產生,%了結果。

這個答案(-i去掉了標誌)會產生與輸入相同的輸出。

您可以使用sed添加引號,然後使用paste合併行,如下所示:

sed 's/^\|$/"/g'|paste -sd, -

如果您正在執行基於 GNU coreutils 的系統(即 Linux),您可以省略結尾的'-'.

如果您輸入的數據具有 DOS 風格的行尾(如 @phk 建議的那樣),您可以按如下方式修改命令:

sed 's/\r//;s/^\|$/"/g'|paste -sd, -

使用awk

awk 'BEGIN { ORS="" } { print p"'"'"'"$0"'"'"'"; p=", " } END { print "\n" }' /path/to/list

具有較少外殼轉義的替代方案,因此更具可讀性:

awk 'BEGIN { ORS="" } { print p"\047"$0"\047"; p=", " } END { print "\n" }' /path/to/list

輸出:

'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'

解釋:

沒有所有轉義的awk腳本本身是BEGIN { ORS="" } { print p"'"$0"'"; p=", " } END { print "\n" }. 在列印第一個條目後,變數p被設置(在此之前它就像一個空字元串)。使用此變數p,每個條目(或在awk-speak: record中)都有前綴,並在其周圍附加單引號列印。不需要awk輸出記錄分隔符變數(因為前綴是為你做的),所以它在ing 處設置為空。哦,我們可能會將我們的文件添加到換行符(例如,它可以與其他文本處理工具一起使用);如果不需要,則可以刪除該部分及其之後的所有內容(單引號內)。ORS``BEGIN``END``END

筆記

如果您有 Windows/DOS 樣式的行尾 ( \r\n),則必須\n先將它們轉換為 UNIX 樣式 ( )。為此,您可以tr -d '\015'在管道的開頭放置:

tr -d '\015' < /path/to/input.list | awk […] > /path/to/output

(假設您的文件中對 s 沒有任何用途\r。這裡假設非常安全。)

或者,只需執行dos2unix /path/to/input.list一次即可就地轉換文件。

引用自:https://unix.stackexchange.com/questions/338116