我在 Bash 脚本中有以下代码:
#!/bin/bash
# gives summary of my buyings in the report.txt file
echo Here is the summary of your purchases:
echo =========================================
echo
# /dev/stdin is the standard input, i.e. the file
cat /dev/stdin | cut -d ' ' --fields=2,3 | sort && sed -n '2 p' /dev/stdin
所以我想要的是打印第二个和第三个字段,并使用空格作为分隔符,并使用 打印report.txt 的第二行sed
。那么我该怎么做呢?
更新:
我的report.txt的内容是:
Jakaria Books 5
Sakib Khata 3
Afzal Pen 12
Sharif Colorpen 2
Sakib Eraser 1
Sharif Sharpner 1
我根据建议编辑了我的脚本,现在内容如下:
#!/bin/bash
# gives summary of my buyings in the report.txt file
echo Here is the summary of your purchases:
echo =========================================
# /dev/stdin is the standard input, i.e. the file
cat /dev/stdin | cut -d ' ' --fields=2,3 | sort | sed -n '2 p'
我运行我的脚本,因为我的脚本文件名在cat report.txt | ./summary
哪里。summary
现在输出是Books 5
.
除了打印第二个和第三个字段之外,我还想打印report.txt的第二行,即输出应如下所示:
Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sharpner 1
Sharif Sharpner 1
答案1
当您链接sed
命令时,&&
您告诉 shell 单独运行该命令。留下cat ... cut ... sort
输出然后还打印第二行,没有任何剪切。
如果您只想打印输入的第二行(已排序),请将其更改为:
cut -d ' ' --fields=2,3 | sort | sed -n 2p
无需重复 /dev/stdin,因为当您不提供输入文件时,两者都会读取 stdin cut
。sed
要从文件中打印第二个和第三个空格分隔字段,以及打印整个第二行,您可以在 sed 中完成这一切:
sed -e 2p -e 's/^[^ ]* //' < report.txt | sort
这告诉 sed 二执行两个程序:
p
打印线 2,以及s
搜索并替换:从行的开头开始,零个或多个非空格字符,后跟一个空格... with:(无)
当运行更新的示例输入时,我得到:
Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sakib Khata 3
Sharpner 1
...因为Sakib Khata 3
是文件的第二行。
答案2
/dev/stdin
读取变量 的内容:
content=$(cat)
echo "$content" | cut -d ' ' --fields=2,3 | sort
echo "$content" | sed -n '2p'
cat
默认从 读取stdin
。
例子:
(
content=$(cat);
echo "$content" | cut -d ' ' --fields=2,3 | sort;
echo "$content" | sed -n '2p'
) < <(echo -e "a b c\nd e f\ng h i\n")
b c
e f
h i
d e f
更新:
您编辑的问题的示例
echo 'Jakaria Books 5
Sakib Khata 3
Afzal Pen 12
Sharif Colorpen 2
Sakib Eraser 1
Sharif Sharpner 1' | (
content=$(cat);
echo "$content" | cut -d ' ' --fields=2,3 | sort;
echo "$content" | sed -n '2p'
)
Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sharpner 1
Sakib Khata 3