我很清楚我可以在这里做些什么,使用grep -v '^--'
和grep -A 1
,但我想我可能需要使用awk来匹配。
我的数据如下:
Random text line 1
--Data1
Random text line 2
--Data2
Random text line 3
--Data3
Random text line 4
--Data4
Random text line 5
--Data5
问题是,我需要运行一个命令 - 让我们在不以' - '开头的所有行上调用它command1
并捕获输出以及它下面的行。
所以我想要组合的三个命令是:
grep -v '^--' file.txt | command1 > text-output
grep -A 1 [not sure] > --data-below-text
我可以通过将变量存储在while read line; do
类型的命令中然后存储和回显变量来实现。但是,我觉得可能有一种更简单的方法可以更有效地获得以下内容:
Random text line 1, text-output, --Data1
Random text line 2, text-output, --Data2
Random text line 3, text-output, --Data3
Random text line 4, text-output, --Data4
Random text line 5, text-output, --Data5
当然,如果使用变量是唯一的方法,我也愿意这样做。我只是想确保,因为我知道如果我决定在路上并行使用代码,变量会变得有点冒险。任何方向都非常感谢。
答案 0 :(得分:1)
这是一种方式:
command_wrapper(){
in=$(cat -)
one=$(echo "$in" | head -n1)
two=$(echo "$in" | tail -n1)
result=$(echo "$one" | command1)
echo "$one, $result, $two"
}
grep -A1 -v '^--' file.txt | command_wrapper
这是另一种方式:
textlines=$(grep -v '^--' file.txt)
results=$(echo "$textlines" | command1)
datalines=$(grep '^--' file.txt)
paste <(echo "$textlines") <(echo "$results") <(echo "$datalines") |
tr '\t' ',' > output.txt
答案 1 :(得分:0)
这是awk的一种方式,可以做你以后的事情。
$ cat yourcommand
echo "printing : $@"
:~/test/awk$ awk '!/^--/ { cmd = "./yourcommand "$0 ; cmd | getline outvar ; print outvar } /^--/ { print }' 1
printing : Random text line 1
--Data1
printing : Random text line 2
--Data2
printing : Random text line 3
--Data3
printing : Random text line 4
--Data4
printing : Random text line 5
--Data5
我们匹配所有不以 - 开头的行,并将该行的输出传递给&#39; ./ yourcommand&#39; - 在我的情况下,只是预先打印&#39;打印:&#39;到了这一行 - 但你应该可以用自己的输入命令替换。
awks getline然后将输出存储在outvar中,然后我们将其打印出来。以 - 开头的行正常打印。
编辑:getline只获取下一行。如果你有更多的线要提取,让我知道,我应该能够让它给你剩下的。