xargsの出力のフォーマット


10

出力xargsディスプレイのフォーマットを変更したい

cat k.txt 
1 
2 
3 

そして

cat k.txt | xargs 
1 2 3

しかし、私は持っていると思います1, 2, 31|2|3。助言がありますか?


これは(正確にはこれではありません)のようなもので実現できますがxargs cat -n、改行文字をトリムするだけの場合は簡単です。これはecho $(cat)grepまたはawk(それを行う方法をクロール)で実現できます。xargs現在の目的にうまく適合しない。
41754

回答:


18

以下は、このようなファイルを取得する方法の数十例です。

$ cat k.txt
1
2
3

そして、それをこのフォーマットに変換します:

1,2,3

一緒にプレイしたい場合は、このコマンドを使用して上記のファイルを作成できます。

$ cat <<EOF > k.txt
1
2
3
EOF

以下の例は2つのグループに分かれています。「機能する」ものと「ほとんど」機能するもの。多くの場合、何かが機能しない理由を確認することは、何かが機能しない理由を確認することと同じくらい価値があるため、これらを残します。

私がよく知っているほとんどのスクリプト言語が表現されています。Perlで通常参照される有名な頭字語であるTIMTOWTDIと同様に、いくつかは複数回表されます。

注:,以下の例では、カンマ()を入れ替えて、必要な文字に置き換えることができます|

「機能する」例

これらのコードスニペットは、目的の出力を生成します。

pasteコマンド:

$ paste -s -d ',' k.txt 
1,2,3

sedコマンド:

$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3

$ sed ':a;{N;s/\n/,/};ba' k.txt 
1,2,3

perlコマンド:

$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3

$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3

awkコマンド:

$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3

$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

pythonコマンド:

$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3

$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3

Bashのmapfile組み込み:

$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3

rubyコマンド:

$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3

$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3

phpコマンド:

$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3

注意事項

上記の例のほとんどは問題なく動作します。上記のPHPの例のように、いくつかの問題が隠れています。関数chop()は実際にはのエイリアスrtrim()であるため、最後の行の末尾のスペースも削除されます。

最初のRubyの例と最初のPythonの例も同様です。問題は、それらがすべて、基本的に末尾の文字を盲目的に「切り落とす」タイプの操作をどのように利用しているかにあります。これは、OPが提供する例では問題ありませんが、これらのタイプの1ライナーを使用して、処理中のデータに確実に準拠するように注意する必要があります。

k.txt代わりに次のようなサンプルファイルを言います。

$ echo -en "1\n2\n3" > k.txt

見た目は似ていますが、少し違いがあります。\n元のファイルのような末尾の改行()はありません。最初のPythonの例を実行すると、次のようになります。

$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,

「ほぼ」機能する例

これらは「常に花嫁介添人であり、決して花嫁ではない」例です。それらのほとんどはおそらく適応できますが、問題の潜在的な解決策を実行するとき、それが「強制された」と感じたとき、それはおそらく仕事にとって間違ったツールです!

perlコマンド:

$ perl -p -e 's/\n/,/' k.txt
1,2,3,

trコマンド:

$ tr '\n' ','  < k.txt 
1,2,3,

cat+のechoコマンド:

$ echo $(cat k.txt)
1 2 3

rubyコマンド:

$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,

Bashのwhile+ read組み込み:

$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,

1
awk私は短い代替を好む:awk -vORS=, 1 k.txt
manatwork

CentOSのは持っていないことを確認するかどうかbashmapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
manatwork

末尾の改行がわからない。私のテストによると、あなたperlと最初awkにそれらも持っています。
manatwork 2013

paste一番上に置きます。それがまさにpaste -sここでの目的です。これは標準のコマンドであり、最も効率的です。他のすべてのものはやり過ぎであるか、移植性がないか、制限がある。
ステファンChazelas

mapfileは比較的新しく、bash4.0 で追加されました。
manatwork 2013

4

@slmはすでに良い答えを与えていますが、あなたの質問として「xargsのフォーマット出力」

xargs -I{} echo -n "{}|" < test.txt
  • -I 「文字列の置換」オプションです。
  • {} 出力テキストのプレースホルダーです。
  • これは、「検索」で中括弧のペアを使用するのと似ています。

末尾|を削除したい場合sedは、クリーンアップに使用できます。

$ xargs -I{} echo -n "{}|" < k.txt  | sed -e 's/|$//'
1|2|3

3.「1 | 2 | 3 |」の後に追加のパイプが追加されます。whileループとawkソリューションで同じ問題が発生しています。
slm

はい、新しいラインがあれば.. trsedその他も..
Rahul Patil 2013

2

これは古いスレッドです。OPは、このような単純なコードで尋ねました。それをオリジナルに近づけるために、私は簡単な解決策を持っています。

cat k.txt | xargs
1 2 3

sedを使用する

cat k.txt | xargs | sed 's/ /,/g'
1,2,3

または

cat k.txt | xargs | sed 's/ /|/g'
1|2|3

sedは少し奇妙に見えるかもしれませんが、壊れています。

代用です。g 'はグローバルです。これがないと、新しい行ごとに最初の置換のみが行われます。「xargs」を使用しているため、1行で表示されます。したがって、「1,2 3」が得られます。

区切り文字は分離に使用されます。/文字を使用しました。興味深いトリックの1つ:引用符間で同じ形式を維持している限り、区切り文字を他のほとんどの文字に置き換えることができます。したがって、これも機能します...

cat k.txt | xargs | sed 's# #,#g'

または

cat k.txt | xargs | sed 'sT T,Tg'

明らかに、区切り文字として特定の文字を使用すると、混乱する可能性があるため、賢くしてください。


0
xargs <k.txt | tr \  \|

あなたが必要としないcat-他のコマンドを与えられていない場合- -単にファイルの入力に渡すとxargsと種類のものである-そのデフォルトフォーマットアウト渡します/bin/echoさん(バックスラッシュC-エスケープ解釈せずに)

xargs入力ファイルから先頭/末尾の空白を取り除き、空白の他のシーケンスを1つのスペースに絞り込みます。これは、ファイルをtrからxargslikeに渡すときに、

tr \\n \| <k.txt | xargs

...プリント...

1|2|3|

...行く他の方法をして上でのみ動作して引数というxargsスペースで区切るはありません....

1|2|3\n

... テキストファイルの場合と同様にxargs、最後の改行を出力しますが、そのように解釈されないためです。tr

ただし、これ(またはここで提供される他のソリューション)ではxargs、入力の引用は考慮されていません。xargs入力で文字通りシングル/ダブル/バックスラッシュで引用された非改行の空白文字を渡します。それ自体は次のように引用できます:

xargs <<\IN
1    2'      3'\'      \'4
IN

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