將單獨的行轉換為帶有引號的條目的逗號分隔列表
我有以下數據(從 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
一次即可就地轉換文件。