各最後の行にシリアル番号を生成します。投稿が修正されました。誰でもこれについての助けとアドバイスを提供できますか?

各最後の行にシリアル番号を生成します。投稿が修正されました。誰でもこれについての助けとアドバイスを提供できますか?

このクエリがあります

sed '/./=' abc.txt| sed '/./N; s/\n/, /' >> as.dat


source file has 3 rows like below
a
b
c

次のコマンドを使用すると、次の結果が表示されます。

Output 

    1 a
    2 b 
    3 c 

しかし、私は次のコマンドを出力したいと思います。

Output 

    a 1 
    b 2 
    c 3 

ベストアンサー1

cutUnixにはandと呼ばれる素晴らしい小さなツールがありますpaste。このcutツールは、列の挿入中に入力から列セットを抽出しますpaste。私たちはこれを使用します。

私はあなたのパイプラインをあまり気にしません(今はこの答えの終わりを見てください)、熱変換の問題にのみ興味があります。

次のファイルにデータがあるとしますcols.txt

$ cat cols.txt
1 a
2 b
3 c

$ paste -d ' ' cols.txt cols.txt
1 a 1 a
2 b 2 b
3 c 3 c

ユーティリティはpaste通常、列の間にタブ文字を挿入しますが、ここではスペース(-d ' ')を挿入するように指示します。

paste次に、with出力から2番目と3番目の列を抽出しますcut

$ paste -d ' ' cols.txt cols.txt | cut -d ' ' -f 2,3
a 1
b 2
c 3

cut私たちは、「フィールド区切り文字」(、それ以外の場合はタブが必要です)としてスペースがあり、フィールド2と3()を-d ' '持ちたいと言いました。-f 2,3(残念ながら、元の入力のcut「」列のみが必要です。2,1いいえ熱を交換します。 )

したがって、最終的にここでは汚れた正規表現の魔法は必要ありません。

パイプラインに戻ります。スクラップしましょう。各行に行番号を挿入したいようです。nl( "numberline")という別のUnixツールがあります。

$ nl abc.txt
     1  a
     2  b
     3  c

デフォルトでは、空でない各行の行番号を取得します。前にはパディング用のスペースがあり、タブで元の行と区切ります。空行にも番号を付けますか?

$ nl -b a abc.txt

私が知っている1nl行の右側に行番号を入れることはできませんが、入力の2つの列を置き換える解決策があるので問題ありません。

$ paste <(nl abc.txt) <(nl abc.txt) | cut -f 2,3
a            1
b            2
c            3

ここでは、区切り文字を指定する必要はありません。nl各行の先頭にスペースを挿入し、その後に行番号とタブ文字を挿入します。paste列の間にタブを挿入してcutタブを切り取ると機能します。

列の間に空白が必要な場合(タブといくつかの空白がある場合)、それをコマンド| tr -s '\t' ' 'に追加します。これは、すべてのタブ文字を空白に変更(「音域」)し、結果の連続する-s空白を単一の空白に「圧縮」()します。

カンマとスペースが必要な場合は、以下を使用してください| tr '\t ' ', '

$ paste  <(nl abc.txt) <(nl abc.txt) | cut -f 2,3 | tr -s '\t ' ', '
a, 1
b, 2
c, 3

これは、1行に複数の単語を含むファイルでは機能しますが、タブ文字を含むファイルは失敗します。

$ cat abc.txt    # no tabs in this file though
a text     there is a
b goes     hole in my
c here     pants

$ paste  <(nl abc.txt) <(nl abc.txt) | cut -f 2,3
a text     there is a        1
b goes     hole in my        2
c here     pants             3

おすすめ記事