文件行到列的转换


15

假设我有一个文件:

文件1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

我想要的File2:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

行到列的转换File1。


如果您的文件包含多于一行,因此您的输出应具有多于一列,请尝试使用此AWK脚本
暂停,直到另行通知。

相关性非常高的问题:askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

Answers:


20

使用tr,将每个重复的空格字符()替换为单个换行符(\n)。

tr -s ' '  '\n'< infile > outfile

但是我想你想要这样的东西吗?

1 2 3 4 1 a#
abcd-> 2 b $
#$ @%3 c @
                4 d%

随着awk我们可以这样做:

awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } 
    END{ for (i in RtoC) print RtoC[i] }' infile

END会将每个相同的归档编号位置连接在一起,并打印结果,该结果将是第一列的第一行,第二列的第二行,等等。当然,输入文件仅限于您的内存大小。


我尝试使用相同的数据和代码,它将最后一列打印为第一条记录,例如4 d%,然后第二条记录1 a#,依此类推。
Abhinay


8

您还可以使用以下fmt命令:

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI


6

您也可以使用sed

$ sed -e 's/  */\n/g' file1 > file2

注意:不能处理单词包含空格的情况。


据我所知,这需要GNU sed。Mac(BSD)附带的版本不\n视为换行符
D. Ben Knoble

5

使用awk,将输出字段分隔符(OFS)设置为记录(行)分隔符(RS):

awk '{OFS=RS;$1=$1}1' file > file2


0

您也可以尝试使用 sed

$ sed -i.bak s@' '@'\n'@g infile.txt

请注意,我@用作替代操作的分隔符。这还将创建一个备份文件。如果您不需要备份,请删除.bak

$ sed -i s@' '@'\n'@g infile.txt

0

Python版本:

python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt

这使用<重定向到python的stdin中,input.txt并写入output.txt使用>重定向。单行代码本身从所有行中读取stdin一个字符串列表,其中所有空格都用换行符代替,我们使用.join()函数重建整个文本。

避免用换行符替换串联的多个空格的替代方法是使用.split()将行分成单词列表。这样,我们可以确保每个单词仅由一个换行符分隔

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt

0

使用xargs,(从souravc的答案中窃取):

xargs -n 1 < File1 > File2

或者,如果需要任何较小的重新格式化,请使用printf格式字符串,但可能需要这样做:

xargs printf '%s\n' < File1 > File2

0

我的解决方案是:

#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.