行から列に変換する方法は?


11

(同じ行に)このような順序で番号が付けられた.txtファイルがあります。

106849_01373    106849_01967    106850_00082    23025.7_01059   

私はそれらをそのように変換したいと思います:

106849_01373
106849_01967
106850_00082
23025.7_01059

使用するコマンドがわかりません。誰かがこれを手伝ってくれる?

回答:


5

こちらは xargs

xargs -n1 < file.txt

デモ:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargsは優れたツールであり、言及していなかったとしてもそうですが、コマンドを省略した場合、echoに置き換えられるという欠点があります(一部のシェルとは異なり、xargsには組み込みのechoがありません)。および-n1は、すべての引数に対してコマンドを呼び出すようにxargsに指示するため、この例では、少なくとも6つのプロセス(ioリダイレクション、xargs、および4つのエコーを行うシェル)が必要になります。これはこのスコープではそれほど悪くありませんが、数千行の出力ではかなり遅くなります。
2016年

16

とても簡単tr

tr -s '[:blank:]' '\n' <file.txt

例:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

heemaylの答えは進むべき道ですが、Perlを使用する別の方法があります。

perl -lane '$,="\n"; print(@F)' file.txt
  • -l:自動改行処理を有効にします。2つの異なる効果があります。まず、-nまたは-pと一緒に使用すると、$ /(入力レコード区切り文字)が自動的に表示されます。次に、$ \(出力レコードセパレーター)をoctnumの値に割り当てて、すべての印刷ステートメントにそのセパレーターが追加されるようにします。octnumを省略すると、$ \を$ /の現在の値に設定します。
  • -a:-nまたは-pとともに使用すると、自動分割モードがオンになります。@F配列への暗黙の分割コマンドは、-nまたは-pによって生成される暗黙のwhileループ内で最初に実行されます。
  • -n:プログラムの周りでPerlが次のループを想定するようにします。これにより、sed -nまたはawkのようなファイル名引数を反復処理します。

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e:プログラムの1行を入力するために使用できます。

  • $,="\n":出力フィールドセパレータを改行に設定します。
  • print(@F):出力フィールド区切り文字で区切られたフィールドを印刷します。
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKアプローチ。基本的に、フィールドの出力セパレーターの変更とループ。テストファイルは、ENDLINEを最後に繰り返し貼り付けた例です

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

使用sed

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

ないquite..itはそれぞれ(最初の)行の後に改行を追加します。..
heemayl

複数行に確認してください、あなたは...そして、クリアケースになるだろう
heemayl

回答の例を追加して
いただけ

@heemayl末尾のスペースを改行にすることを意味しました。構文が理解しにくい。:/
techraf 2016年

1

私は楽しみのためにPythonソリューションを追加するだけです:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

このコマンドは、変換するファイル名を最後に引数として使用して、単一引用符で囲まれた1行のPython 3スクリプトを実行します。構文は次のとおりです。

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

使用する1行のスクリプトは次のとおりです(明確にするために複数行に展開されています)。

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

sysモジュールをインポートしてコマンドライン引数を読み取り、最初に指定された引数をファイル名として開いて、空白文字で区切られた各データチャンクをファイルから1行に出力します。

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.