回答:
以下は、このようなファイルを取得する方法の数十例です。
$ 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,
awk
私は短い代替を好む:awk -vORS=, 1 k.txt
bash
:mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
perl
と最初awk
にそれらも持っています。
paste
一番上に置きます。それがまさにpaste -s
ここでの目的です。これは標準のコマンドであり、最も効率的です。他のすべてのものはやり過ぎであるか、移植性がないか、制限がある。
mapfile
は比較的新しく、bash
4.0 で追加されました。
@slmはすでに良い答えを与えていますが、あなたの質問として「xargsのフォーマット出力」
xargs -I{} echo -n "{}|" < test.txt
-I
「文字列の置換」オプションです。{}
出力テキストのプレースホルダーです。末尾|
を削除したい場合sed
は、クリーンアップに使用できます。
$ xargs -I{} echo -n "{}|" < k.txt | sed -e 's/|$//'
1|2|3
tr
、sed
その他も..
これは古いスレッドです。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'
明らかに、区切り文字として特定の文字を使用すると、混乱する可能性があるため、賢くしてください。
xargs <k.txt | tr \ \|
あなたが必要としないcat
-他のコマンドを与えられていない場合- -単にファイルの入力に渡すとxargs
と種類のものである-そのデフォルトフォーマットアウト渡します/bin/echo
さん(バックスラッシュC-エスケープ解釈せずに)。
xargs
入力ファイルから先頭/末尾の空白を取り除き、空白の他のシーケンスを1つのスペースに絞り込みます。これは、ファイルをtr
からxargs
likeに渡すときに、
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
xargs cat -n
、改行文字をトリムするだけの場合は簡単です。これはecho $(cat)
、grep
またはawk
(それを行う方法をクロール)で実現できます。xargs
現在の目的にうまく適合しない。