我想更改输出 xargs 显示的格式
cat k.txt
1
2
3
Run Code Online (Sandbox Code Playgroud)
和
cat k.txt | xargs
1 2 3
Run Code Online (Sandbox Code Playgroud)
但是我想拥有1, 2, 3
or 1|2|3
。有什么建议?
slm*_*slm 20
下面是十几个关于如何获取这样的文件的示例:
$ cat k.txt
1
2
3
Run Code Online (Sandbox Code Playgroud)
并将其转换为这种格式:
1,2,3
Run Code Online (Sandbox Code Playgroud)
如果你想一起玩,你可以使用这个命令来创建上面的文件:
$ cat <<EOF > k.txt
1
2
3
EOF
Run Code Online (Sandbox Code Playgroud)
下面的示例分为 2 组。那些“工作”的和“几乎”工作的。我离开这些是因为很多时候,了解某些东西为什么不起作用与了解某些东西为什么起作用一样有价值。
我熟悉的大多数脚本语言都有代表。有些被多次表示,因为与 Perl 中通常引用的著名首字母缩略词TIMTOWTDI 一样。
注意:您可以,
在下面的示例中替换逗号 ( ) 并将其替换为您想要的任何字符,即|
.
这些代码片段将产生所需的输出。
该paste
命令:
$ paste -s -d ',' k.txt
1,2,3
Run Code Online (Sandbox Code Playgroud)
该sed
命令:
$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3
$ sed ':a;{N;s/\n/,/};ba' k.txt
1,2,3
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
Bash 的mapfile
内置:
$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3
Run Code Online (Sandbox Code Playgroud)
该ruby
命令:
$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3
$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3
Run Code Online (Sandbox Code Playgroud)
该php
命令:
$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3
Run Code Online (Sandbox Code Playgroud)
注意事项
上面的大多数示例都可以正常工作。有些有隐藏的问题,例如上面的 PHP 示例。该函数chop()
实际上是 的别名rtrim()
,因此最后一行的尾随空格也将被删除。
第一个 Ruby 示例和第一个 Python 示例也是如此。问题在于他们如何使用一种基本上盲目地“砍掉”尾随字符的操作。这对于 OP 提供的示例来说很好,但是在使用这些类型的单衬时必须小心,以确保它们符合他们正在处理的数据。
例子
说我们的示例文件,k.txt
看起来像这样:
$ echo -en "1\n2\n3" > k.txt
Run Code Online (Sandbox Code Playgroud)
它看起来很相似,但它有一个细微的区别。它\n
不像原始文件那样有尾随换行符 ( )。现在,当我们运行第一个 Python 示例时,我们得到以下信息:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,
Run Code Online (Sandbox Code Playgroud)
这些是“永远是伴娘,永远不是新娘”的例子。他们中的大多数可能都可以适应,但是在为问题寻找潜在的解决方案时,当感觉“被迫”时,它可能是错误的工作工具!
该perl
命令:
$ perl -p -e 's/\n/,/' k.txt
1,2,3,
Run Code Online (Sandbox Code Playgroud)
该tr
命令:
$ tr '\n' ',' < k.txt
1,2,3,
Run Code Online (Sandbox Code Playgroud)
在cat
+echo
命令:
$ echo $(cat k.txt)
1 2 3
Run Code Online (Sandbox Code Playgroud)
该ruby
命令:
$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,
Run Code Online (Sandbox Code Playgroud)
Bash 的while
+read
内置插件:
$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,
Run Code Online (Sandbox Code Playgroud)
@slm 已经给出了很好的答案,但作为你的问题“xargs 的格式输出”
xargs -I{} echo -n "{}|" < test.txt
Run Code Online (Sandbox Code Playgroud)
-I
是“替换字符串”选项。{}
是输出文本的占位符。如果你想摆脱尾随,|
你可以sed
用来做一些清理:
$ xargs -I{} echo -n "{}|" < k.txt | sed -e 's/|$//'
1|2|3
Run Code Online (Sandbox Code Playgroud)