我有一个文本文件:
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
意味着“自动从列计算行”。