Text-Processing

塊的文本處理行到列

  • April 9, 2019

我有一個包含 Solaris 列表的文件:

List A
hi
hello
hw r u

List B
Hi
Yes

List C
Hello

我需要轉置列表,如下所示:

List A    List B    List C
hi        Hi        Hello
hello     Yes
hw r u

我怎樣才能在 Solaris 上做到這一點?

您可以使用awk將每個塊拆分為單獨的文件,然後將paste它們放在一起(下面假設每個列表之間總是有空行)。

awk '/^$/ {N++;next}{print >"file"N}' infile.txt
paste file*

您也可以將paste命令移動到awk.

awk '/^$/ {N++;next}{print >"file"N} END{system("paste file*")}' inile.txt

輸出是:

List A    List B    List C
hi        Hi        Hello
hello     Yes
hw r u

在改變如下線長度時產生美麗的壓痕:

輸入文件:

list A
hi
hello
hw r u

List B
Hi this is list B
Yes

List C
Hello, this is list C

你可以做paste file* |column -s $'\t' -tn並且會有結果:

list A  List B             List C
hi      Hi this is list B  Hello, this is list C
hello   Yes
hw r u

除了我之前的回答之外,還有csplit命令以同樣的方式拆分文件,然後使用paste命令來獲得所需的輸出。

csplit -zs -f outputfile inputfile '/^List/' '{*}'
paste outfile*
  • '/^List/'是一種模式,用於匹配並將那裡的文件分解為下一個新文件
  • '{*}'盡可能多地重複模式
  • -z用於刪除空的輸出文件;並且-s用於不列印輸出文件大小的計數
  • -f用於定義自定義前綴*outputfile##*其中##預設為 2 位,您可以定義它-n N(N 是定義前綴後的後綴中的位數)

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