xargsのフォーマットされた出力

xargsのフォーマットされた出力

出力xargsの表示形式を変更したいです。

cat k.txt 
1 
2 
3 

そして

cat k.txt | xargs 
1 2 3

1, 2, 3しかし、私はまたはをしたいと思います1|2|3。どんな提案がありますか?

答え1

これらのファイルを取得する方法の12の例は次のとおりです。

$ cat k.txt
1
2
3

そして、次の形式に変換します。

1,2,3

一緒にプレイするには、次のコマンドを使用して上記のファイルを生成できます。

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

以下の例は2つのグループに分かれています。 「動作」して「ほぼ」動作すること。何度も何かがうまくいかないのを理解することは、なぜそれがうまくいくのかを理解するのと同じくらい重要なので、これを省略します。

私がよく知っているほとんどのスクリプト言語が表現されています。 Perlでよく引用されているよく知られている略語のように、いくつかは何度も表されます。チームトウィディ

メモ:,次の例では、カンマ()を目的の文字(たとえば)に置き換えることができます|

「有効」の例

これらのコードフラグメントは必要な出力を生成します。

注文する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

バッシュ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によって提供された例では問題ありませんが、このタイプのライナーを使用するときは、作業中のデータに合うように注意する必要があります。

はい

たとえば、サンプルファイルは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,

答え2

@slmはすでに良い答えを与えていますが、「xargs出力の書式設定」の質問のように

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

末尾を削除するには、以下を使用してクリーンアップ操作を実行|できますsed

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

答え3

私はこれが古いスレッドであることを知っています。 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」が得られます。

区切り文字は区切りに使用されます。 /文字を使用しました。興味深いトリック:引用符の間に同じ形式を維持する限り、区切り文字を他のほとんどの文字に置き換えることができます。だからこれも効果があるかもしれません...

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

または

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

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

答え4

xargs <k.txt | tr \  \|

その必要はありませんcat。ファイル入力だけを渡すだけです。他のコマンドが与えられない場合、デフォルトのxargs形式が渡されます/bin/echo(バックスラッシュ c-escape 解釈なし)

xargs入力ファイルから先行/末尾のスペースを削除し、他のスペースシーケンスを単一のスペースに圧縮します。これは、からtr次へファイルを渡すときを意味しますxargs

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

関連情報