ファイルの行から列への変換


15

ファイルがあるとします:

File1:

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

File2が欲しい:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

File1の行から列への変換。


ファイルが複数の行で構成されているため、出力に複数の列が必要な場合は、このAWKスクリプトを試してください。
追って通知があるまで一時停止します。

非常に関連する質問:askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

回答:


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、1列目の1行目、2列目の2行目などの結果が出力されます。もちろん、入力ファイルはメモリサイズに制限されます。


同じデータとコードで試しましたが、最後の列を4 d%のような最初のレコードとして印刷し、次に2番目のレコードを1 a#などとして印刷しました。
アビナイ

8

これは単にgrepを使用して行うことができます。デフォルトでは、grepは、一致を別の改行で出力します。

grep -oP '\S+' infile > outfile

または

grep -o '[^[:space:]]\+' infile > outfile

1
+1のクリエイティブな使用grep
Volker Siegel

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

注:単語にスペースが含まれる状況は処理しません。


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()行を単語のリストに分割することです。そうすれば、各単語が1つの改行だけで区切られていることを確認できます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.