你想做的事

输入(标准输入)

标准输入
A
B
C
D
E
F

输出(标准输出)

标准输出
A,B,C
D,E,F

结论

在这里回答。
https://superuser.com/a/1738053/1722949

$ cat split.sh
#!/bin/bash -x
<input.txt pr -3tas,
<input.txt paste -d, - - -
<input.txt awk 'ORS=NR%3?",":"\n"'
<input.txt perl -pe'$.%3&&s/\n/,/'
<input.txt split -l3 --filter=paste\ -sd,
<input.txt perl -l0pe '$_.=$.%3?",":"\n"'

$ ./split.sh
+ pr -3tas,
A,B,C
D,E,F
+ paste -d, - - -
A,B,C
D,E,F
+ awk 'ORS=NR%3?",":"\n"'
A,B,C
D,E,F
+ perl '-pe$.%3&&s/\n/,/'
A,B,C
D,E,F
+ split -l3 '--filter=paste -sd,'
A,B,C
D,E,F
+ perl -l0pe '$_.=$.%3?",":"\n"'
A,B,C
D,E,F

评论

<input.txt

将 input.txt 流式传输到命令的标准输入(重定向)。
重定向可以在任何地方。
以下是等效的(根据子进程启动等严格不同)

$ <input.txt command arg1 arg2
$ command <input.txt arg1 arg2
$ command arg1 <input.txt arg2
$ command arg1 arg2 <input.txt
$ cat input.txt | command arg1 arg2

pr -3tas,

  • pr: 打印机输出的格式化命令
  • -3: 3 列
  • -t: 没有标题
  • -a:水平而不是向下(见下文)
  • -s,:以逗号分隔

如果没有-a,则行为将是多列的。

$ seq 9 | pr -3ts,
1,4,7
2,5,8
3,6,9

paste -d, - - -

paste 逐行加入文件。
这一次,标准输入 (-) 被指定为文件的 3 次。

粘贴
$ paste -d, a.txt b.txt c.txt
a1,b1,c1
a2,b2,c2
a3,b3,c3
a4,b4,c4

awk 'ORS=NR%3?",":"\n"'

awk 基础1(基本形式)
$ awk '条件式{処理}'  # 条件式 が 真 の場合 {処理} を実行する。
$ awk '{処理}'        # 条件式 が暗黙的に 真 となる。
$ awk '条件式'        # {処理} が暗黙的に {print $0} となる。<- 今回のパターン
awk 基础 2(赋值运算符)
### 代入演算子 = は演算結果として代入後の結果を返す。
### 以下の () 内は最終的に a への代入結果の 4 に評価される。
$ awk 'BEGIN{print (a=2+2); print a}'
4
4
### 今回は ORS 変数への代入結果が "," or "\n" なので 条件式 は必ず 真 となる。
awk 基础 3 (ORS)
### ORS 変数で print の改行記号が変更可能。
$ awk 'BEGIN{print 1; ORS="@"; print 2; ORS="/"; print 3}'
1
2@3/
  • 总结
    • awk的基本形式是awk '条件式{処理}'
    • 条件式ORS=NR%3?",":"\n"(=整个参数)
    • {処理}{print $0}(隐式)
    • ORS 赋值给变量的结果是",""\n",所以条件式 总是为真
    • ORS 变量每隔三行是"\n",其他行是",",并调整了print 的换行符号。

perl -pe'$.%3&&s/\n/,/'

  • -p:每行隐含print($_)
    • $_:输入行($0 在 awk 中)
  • -e:指定命令
  • $.:当前行号(NR 在 awk 中)
  • s/\n/,/: 替换为 s 运算符
    • 隐式变为$_ =~ s/\n/,/,替换$_
  • && 短路,s/\n/,/ 仅在 $.%3 为真时执行

split -l3 --filter=paste\ -sd,

分裂
### -l3: 3行ずつに分割
### --filter=command: 分割結果それぞれに対して command を実行
$ seq 6 | split -l3 --filter='cat -n'
     1  1
     2  2
     3  3
     1  4
     2  5
     3  6
粘贴
### -s なし: 行ごとに結合
$ paste -d, a.txt b.txt c.txt
a1,b1,c1
a2,b2,c2
a3,b3,c3
a4,b4,c4

### -s あり: ファイルごとに結合
$ paste -sd, a.txt b.txt c.txt
a1,a2,a3,a4
b1,b2,b3,b4
c1,c2,c3,c4

### 標準入力を1つのファイルとして読む
$ cat a.txt | paste -sd,
a1,a2,a3,a4

perl -l0pe '$_.=$.%3?",":"\n"'

  • -l0:禁用print() 的换行符
  • -p:每行隐含print($_)
    • $_: 输入行 ($0 in awk)
  • -e:指定要运行的命令
  • .=:字符串连接赋值运算符(python3 中的+=
  • $.: 当前行号 (NR in awk)

原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308624004.html

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-21
  • 2021-06-08
  • 2022-12-23
  • 2021-10-02
  • 2022-12-23
猜你喜欢
  • 2021-11-20
  • 2022-12-23
  • 2022-12-23
  • 2021-10-19
  • 2021-07-16
  • 2021-12-12
相关资源
相似解决方案