免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1789 | 回复: 6

[文本处理] 求助大神一个 csh foreach 二次循环的问题 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
发表于 2020-01-06 17:33 |显示全部楼层
本帖最后由 黑王子的白马 于 2020-01-07 10:24 编辑

首先感谢一下同意加我好友的大神,否则发不了贴啊。。。。

需求如下:
#/bin/csh -f
A 文件内容如下:

11 aa
22 bb
33 cc
44 dd
...  ...

cat A | awk '{print $1}' >a1
cat A | awk '{print $2}' >a2

foreach 1 ( cat a1)
set x =$1
foreach 2 (cat a2)
set y = $2

command xxx $1 YYY $2


最终需要得到结果如下:

command xxx 11 YYY aa
command xxx 22 YYY bb
command xxx 33 YYY cc
...
-----------------------------------------------

大概需求如上,因为公司不能系统和windows 互传数据,所以大概敲的描述。我知道这样写不对,因为这样写相当于大循环下套小循环, 试过用for 不知道是公司系统问题还是怎么的如下的for 语句csh不识别,只能在bash 下实现,但是主体脚本全部是用csh 写的,也试过了调用脚本但是发现不能互相调用变量,所以想还是最好能用foreach在csh里实现,读起来容易后人维护也方便。

bash 下写的思路大概是先while 语句读取a1 a2 内容赋值变量,因为发现不先用while 语句 会在for 时 输出都是空格,
for (( i=0; i<xxx;( 这段先给了固定值,因为发现i<${#a[@]} 居然不识别报语法错后来先while直接用cnt 就可以)++i))
do
echo " ${a1[$i}  ..${a2[$i]}"
done
工作中脚本使用需求量不大,自己也非常的业余, 被折磨了两天了,想了很多办法也参考了楼里前辈的经验同事也帮写了一个其他语言的,但是调用维护不便。
求助各位大神不吝赐教,感激涕零




论坛徽章:
0
发表于 2020-01-07 17:00 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2020-01-07 17:13 编辑

坛友你好。

1调用脚本但是发现不能互相调用变量.-------这个问题的根源是bash,和csh是两个进程。连个进程不能互相传值,除非用环境变量这个中介。实际上两个进程都不能互相传值。java如此,powershell也是如此。
1.1 但是捏,powershell是多线程模型的。在一个进程中,两个脚本可以互相传值。而且是传强类型的对象。
详见:powershell 全局变量。
ps第14课:变量的作用域
http://bbs.chinaunix.net/thread-4300246-1-1.html

1.2 powershell两个进程之间是可以传值,传强类型对象的。

2 powershell也用for,foreach。bash中没有foreach。

3 powershell 读起来容易后人维护也方便。

4 我powershell群内 ,有个人免费,公司收费培训。183173532

5 通过在ps1脚本内嵌入bash,csh脚本,命令,等。可以100%兼容老脚本,awk,sed等。

6 最终需要得到结果如下:command xxx 11 YYY aa
-----win,linux通用的,powershell代码如下:
  1. $f = cat a.txt
  2. foreach ($行 in $f)
  3. {
  4.      $temp = $行 -split ' '
  5.      & command xxx $temp[0] yyy $temp[1] #执行command,带2个参数
  6. }
复制代码

结论:

为什么我总说 powershell 【强】【简】死你?
只要能装上powershell的linux,其他脚本,就可以休息了。
powershell脚本可以在vscode上,本地调式,远程调试。
难道 开源 + 免费 + 简单 + 强大,是你反对的?

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
发表于 2020-01-07 21:26 |显示全部楼层
我解决这个问题的思路是这样的,不在命令行内解决这些,首先利用awk生成命令语句完后放在文件里,然后去执行文件里的命令,如下

root@lp:~/jw/bash# cat A
11 aa
22 bb
33 cc
44 dd
root@lp:~/jw/bash# cat A|awk '{print "command xxx "$1" YYY "$2}'
command xxx 11 YYY aa
command xxx 22 YYY bb
command xxx 33 YYY cc
command xxx 44 YYY dd
root@lp:~/jw/bash# cat A|awk '{print "command xxx "$1" YYY "$2}' > xx.sh
root@lp:~/jw/bash# sh xx.sh
xx.sh: 1: xxx: not found
xx.sh: 2: xxx: not found
xx.sh: 3: xxx: not found
xx.sh: 4: xxx: not found

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
发表于 2020-01-07 21:26 |显示全部楼层
我解决这个问题的思路是这样的,不在命令行内解决这些,首先利用awk生成命令语句完后放在文件里,然后去执行文件里的命令,如下

root@lp:~/jw/bash# cat A
11 aa
22 bb
33 cc
44 dd
root@lp:~/jw/bash# cat A|awk '{print "command xxx "$1" YYY "$2}'
command xxx 11 YYY aa
command xxx 22 YYY bb
command xxx 33 YYY cc
command xxx 44 YYY dd
root@lp:~/jw/bash# cat A|awk '{print "command xxx "$1" YYY "$2}' > xx.sh
root@lp:~/jw/bash# sh xx.sh
xx.sh: 1: xxx: not found
xx.sh: 2: xxx: not found
xx.sh: 3: xxx: not found
xx.sh: 4: xxx: not found

论坛徽章:
0
发表于 2020-01-07 23:06 |显示全部楼层
  1. cat file
  2. 11 aa
  3. 22 bb
  4. 33 cc
  5. 44 dd

  6. awk '{cmd=sprintf("echo xxx %s yyy %s", $1, $2);system(cmd)}' file
  7. xxx 11 yyy aa
  8. xxx 22 yyy bb
  9. xxx 33 yyy cc
  10. xxx 44 yyy dd
复制代码

评分

参与人数 1可用积分 +10 收起 理由
飘絮絮絮丶 + 10 赞一个!

查看全部评分

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
发表于 2020-01-08 12:19 |显示全部楼层
回复 3# ll104567



因为command XX $1 YY $2 命令后还有一大串的命令要接着执行,本想用循环里直接执行结束了在运行第二轮,实在foreach 不能够,这样awk 也是极好了,非常感谢

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
发表于 2020-01-08 12:25 |显示全部楼层
回复 5# jzsjm1002

如果foreach 实现不了这样awk处理了再做操作也可,非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP