将具有不同列的 N 行转置为单列

将具有不同列的 N 行转置为单列

我的数据样本看起来:

1 2 3 4 5
4 5 6 7 9 9 0
1 2 3 4
1 8 7 6 9

我想改为:

1
2
3
4
5
4
5
6
7
9
9
0
1
2
3
4
1
8
7
6
9

答案1

如果输入线没有空格用这个:

fold -1 data_sample.txt

折叠- 将每个输入行换行以适合指定的宽度。

在这种情况下,宽度是一列,由-1选项指定。


如果输入有空格,但你想省略它们,请使用:

grep -o '\S' data_sample.txt

\S- 匹配任何非空白字符。

-o- 在单独的行上打印每个匹配的部分。

答案2

使用rs(重塑)实用程序:

$ rs 0 1 < data
1
2
3
4
5
4
5
6
7
9
9
0
1
2
3
4
1
8
7
6
9

row输出数组形状由可选参数和参数确定,col如下所示:

If only one of them is a positive integer, rs computes a value for the 
other which will accommodate all of the data.

在本例中,0不是正整数,因此选择行数以将所有字段放在单个列中。

答案3

您可以使用tr以下命令:

tr -s ' ' '\n' < infile

这里有其他选项可以做到这一点。

sed -e $'s/\s*/\\\n/g' infile

或者:

sed 's/\s*/\
/g' infile.txt

或者在某些sed实现中,使用:

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

或者通过gawk(如果你不介意最后一个空行):

awk -v RS='[[:blank:]]*' '1' infile

或者在bash

#!/bin/bash
while read -r line; do 
    echo "${line// \+/$'\n'}";
done < infile

或者读取数组然后printf

#!/bin/bash
while read -a fields; do
    printf "%s\n" "${fields[@]}";
done < infile

答案4

awk '{ for(i=1;i<=NF;i++) print $i; }' input

或者如果应保留空白行:

awk '/^$/ { print; }; { for(i=1;i<=NF;i++) print $i; }' input

相关内容