Linux

將單行拆分為多行,輸入文件中的所有行都缺少換行符

  • March 16, 2018

我有一種方法可以將單行拆分為多行,包含 3 列。文件中所有行的末尾都缺少新行字元。

我嘗試使用 awk,但它將每一列拆分為一行,而不是每行 3 列。

awk '{ gsub(",", "\n") } 6' filename

wherefilename的內容如下所示:

A,B,C,D,E,F,G,H,I,J,K,L,M,N,O

所需的輸出在每行中有 3 列:

A,B,C
D,E,F
G,H,I
J,K,L
M,N,O

使用awk

$ awk -v RS='[,\n]' '{a=$0;getline b; getline c; print a,b,c}' OFS=, filename
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O

這個怎麼運作

  • -v RS='[,\n]'

這告訴 awk 使用任何出現的逗號或換行符作為記錄分隔符。

  • a=$0; getline b; getline c

這告訴 awk 將目前行保存在 variable 中a,將下一行保存在 variable 中,並將下一行保存b在 variable 中c

  • print a,b,c

這告訴 awk 列印a, b, 和c

  • OFS=,

這告訴 awk 在輸出中使用逗號作為欄位分隔符。

使用trpaste

$ tr , '\n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O

這個怎麼運作

  • tr , '\n' <filename

這從文件名讀取,同時將所有逗號轉換為換行符。

  • paste -d, - - -

paste將從標準輸入中讀取三行(每行一個-)並將它們粘貼在一起,每行用逗號 ( -d,) 分隔。

備用 awk

$ awk -v RS='[,\n]' '{printf "%s%s",$0,(NR%3?",":"\n")}' filename
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O

這個怎麼運作

  • -v RS='[,\n]'

這告訴 awk 使用任何出現的逗號或換行符作為記錄分隔符。

  • printf "%s%s",$0,(NR%3?",":"\n")

這告訴 awk 列印目前行,後跟逗號或換行符,具體取決於目前行號的值NR,模 3。

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