每个字段占一行

每个字段占一行

我有一个文本文件:

a   aa  aaa     b   bb  bbb     c   cc  ccc
d   dd  ddd     e   ee  eee     f   ff  fff
g   gg  ggg     h   hh  hhh     i   ii  iii
j   jj  jjj

我如何处理它并获得一个 2 列文件,如下所示:

a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

或者像这样的三列文件:

a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jj

我更喜欢使用 awk 解决方案,但也欢迎其他解决方案。

答案1

将每个字段放在一行上并放在列后。

每个字段占一行

t

tr -s ' ' '\n' < infile

grep

grep -o '[[:alnum:]]*' infile

sed

sed 's/\s\+/\n/g' infile

或更便携:

sed 's/\s\+/\
/g' infile

awk

awk '$1=$1' OFS='\n' infile

或者

awk -v OFS='\n' '$1=$1' infile

柱状

粘贴

对于 2 列:

... | paste - -

对于 3 列:

... | paste - - -

ETC。

sed

对于 2 列:

... | sed 'N; s/\n/\t/g'

对于 3 列:

... | sed 'N; N; s/\n/\t/g'

ETC。

参数

... | xargs -n number-of-desired-columns

xargs用于/bin/echo打印时,请注意看起来像选项的数据echo将被解释为选项。

awk

... | awk '{ printf "%s", $0 (NR%n==0?ORS:OFS) }' n=number-of-desired-columns OFS='\t'

公关

... | pr -at -number-of-desired-columns

或者

... | pr -at -s$'\t' -number-of-desired-columns

列(来自 autogen 包)

... | columns -c number-of-desired-columns

典型输出:

a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj

答案2

$ sed -E 's/\s+/\n/g' ip.txt | paste - -
a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

$ sed -E 's/\s+/\n/g' ip.txt | paste - - -
a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj

答案3

正如通配符所指出的,只有当您的文件格式良好时,这才有效,因为 shell 不会将任何特殊字符解释为通配符,并且您对默认的分词规则感到满意。如果对您的文件是否会“通过”该测试有任何疑问,请不要使用此方法。

一种可能性是使用printf这样做

printf '%s\t%s\n' $(cat your_file)

这将对 的内容进行分词your_file,并将它们配对并用制表符打印它们。您可以%s在 中使用更多格式字符串printf来获得额外的列。

答案4

BSD rs(重塑)实用程序:

$ rs 0 2
a   aa  aaa     b   bb  bbb     c   cc  ccc
d   dd  ddd     e   ee  eee     f   ff  fff
g   gg  ggg     h   hh  hhh     i   ii  iii
j   jj  jjj
[Ctrl-D][Enter]
a    aa
aaa  b
bb   bbb
c    cc
ccc  d
dd   ddd
e    ee
eee  f
ff   fff
g    gg
ggg  h
hh   hhh
i    ii
iii  j
jj   jjj

0 2。指定0意味着“自动从列计算行”。

相关内容