你想做的事
输入(标准输入)
标准输入
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的换行符号。
- awk的基本形式是
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($_)-
$_: 输入行 ($0in awk)
-
-
-e:指定要运行的命令 -
.=:字符串连接赋值运算符(python3 中的+=) -
$.: 当前行号 (NRin awk)
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308624004.html