タブ区切りファイルに値の列を追加する


17

特定の行数を持つファイルに値の列を追加するにはどうすればよいですか。次のような入力ファイルがあります。

入力ファイル:

SPATA17 1   217947738
LYPLAL1 1   219383905
FAM47E  4   77192838
SHROOM3 4   77660162
SHROOM3 4   77660731
SHROOM3 4   77662248

出力ファイル:

SPATA17 1   217947738 file1
LYPLAL1 1   219383905 file1
FAM47E  4   77192838  file1
SHROOM3 4   77660162  file1
SHROOM3 4   77660731  file1
SHROOM3 4   77662248  file1

この場合、ファイルの行数まで値の列を追加します。「file1」などの値は一貫したままです。

その理由は、これらのファイルが100個あるためです。各ファイルを開いて列を貼り付けたくありません。ディレクトリに移動して値の列を追加することで、これを自動化する方法もあります。値はファイル名に由来し、ファイルの各行の最後/最初の列に追加する必要があります。

回答:


22

次のようなワンライナーループを使用できます。

for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done

リスト内の各ファイルについて、これはsed各行の最後にタブとファイル名を追加するために使用します。

説明:

  • -iフラグを使用sedしてインプレース置換を実行し、ファイルを上書きします
  • で置換を実行しs/PATTERN/REPLACEMENT/ます。この例では$、PATTERNは、行の終わり、およびREPLACEMENTは\t(= TAB)であり$f、ループ変数からのファイル名です。s///シェル変数を展開することができるようにコマンドは、二重引用符です。

コードは動作しますが、引用符で囲まれた内容を説明できますか?
ロン14

カラムの操作中に「awk」が使用されるように、「sed」も同様の状況で使用されます。「awk」と「sed」の初心者です。
ロン14

@Ron sedは、パターン置換およびインプレース保存に最も実用的です。ファイルを保存するという要件については、比較的便利なオプションでした。処理している同じファイルに書き戻す必要がない場合、awk通常は作業がはるかに簡単です。
ヤノス14

個人的には、awkの入力/出力フィールドセパレータに頻繁につまずくので、可能な限り使用しないようにして、sedより魅力的にします。
user5359531 16

11

paste命令があるときに、なぜこれらの強力なツールを推奨するのでしょうか!

$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A   1
B   2
C   3
D   4

ちょっとした策略でpaste、OPの目的に使用できます。ただし、インプレースのファイルは置き換えられません。

for f in file1 file2 file3; do 
    paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done

これにより、それぞれのファイル名が各ファイルの最後の列として新しいファイルに貼り付けられます filename.new


ありがとう!paste確かに隠された宝石です。
neu242

10

以下を使用できますawk

awk '{print $0, FILENAME}' file1 file2 file3 ...

各ファイルには異なる名前があるため、これを100回行う必要があります。1回行う方法はありますか?
ロン14

いいえ、FILENAMEはの変数でawk、現在awk処理中のファイル名に展開されます。あなたはそれを1つ行うだけで、すべてのファイルをにフィードしますawk
cuonglm 14

OK、しかし、各ファイルの新しいファイルに出力を送る方法は?awkは処理中に各ファイルを保存しますか?
ロン14

持っている場合GNU awk 4.1.0、または後で、-iインプレース編集に使用できます。それ以外の場合は、出力をawk一時ファイルにリダイレクトしてgrepから、各ファイルから行を抽出する必要があります。
cuonglm

さて、あなたは行うことができますfor file in *; do awk 'BEGIN{OFS="\t"}{print $0, FILENAME}' $file; done
fedorqui
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.