使用Bash命令,我想用一个命令的结果替换文本文件的每一行的字段3,该命令将原始字段3作为参数。字段为/
- 分隔。
输入文件:
./REMOTE_PARENT_DIR/0x134000564f:0x4c:0x0/test_runs/testgsi_O1
./REMOTE_PARENT_DIR/0x134000564f:0x4c:0x0/test_runs/testgsi_O2
...
所需的输出文件(不打印字段1和2,字段3将是Unix命令的结果,打印剩余字段):
/scratch/000011/rin/test_runs/testgsi_O1
/scratch/000011/rin/test_runs/testgsi_O2
...
将字段3转换为普通路径组件的命令:
hostx#lfs fid2path /scratch [0x134000564f:0x4c:0x0]
/scratch/000011/rin
也许使用awk
获取相关字段然后使用命令替换sed
然后吐出新行?
这打印出我需要的位但不知道如何替换文件的行:
awk -F "/" '{ system("/bin/lfs fid2path /scratch " $3) }' outfile.70.sample.tmp
答案 0 :(得分:0)
以下awk
单行将有助于实现您的目标:
awk 'BEGIN { FS="/"; OFS="/" } { cmd = "/bin/lfs fid2path /scratch "$3; cmd | getline path; close(cmd); for (i = 4; i <= NF; i++) { path = path""OFS""$i};print path }' your_input_file.txt
FS
规则中将字段分隔符OFS
和输出字段分隔符/
内置变量分配给斜杠BEGIN
cmd
变量,并将第三个字段$3
作为参数。cmd
shell命令并将其输出传递到内置命令getline
并将其放入变量path
。cmd
,并确保为每条记录运行命令。for
循环,我们将从第4个字段开始的值连接到以[{1}}分隔的path
变量行的结尾。OFS
命令,我只是使用/bin/lfs
对其进行测试以查看结果,看起来很好。 例如cmd = "echo "$3" | cut -d':' -f2"
:
paths.txt
示例电话:
./REMOTE_PARENT_DIR/0x134000564f:0x4c:0x0/test_runs/testgsi_O1
./REMOTE_PARENT_DIR/0x134000564f:0x4c:0x0/test_runs/testgsi_O2
生成结果:
awk 'BEGIN { FS="/"; OFS="/" } { cmd = "echo "$3" | cut -d':' -f2"; cmd | getline path; close(cmd); for (i = 4; i <= NF; i++) { path = path""OFS""$i};print path }' paths.txt
使用shell命令0x4c/test_runs/testgsi_O1
0x4c/test_runs/testgsi_O2
从第三个awk字段$3
中提取特定部分的位置。这是冒号(cut -d':' -f2
)分隔字符串的2nd
字段::
。
答案 1 :(得分:0)
我希望你的问题理解正确,否则告诉我删除它 请回答。
如果您不介意使用 Perl ,那么您可以非常简单直接地进行操作
考虑以下单线
perl -F'/' -ne '$F[2]="add-some-text/"; print @F[2..$#F]' file
它逐行读取文件,并用具有此输出的add-some-text
替换字段2:
all-some-text/test_runstestgsi_O1
all-some-text/test_runstestgsi_O2
现在,如果你想使用一个命令,只需使用命令,而不是简单的文本,但在Perl中使用反向操作符:
perl -F'/' -ne '$F[2]=`date "+%H:M:S"`; print @F[2..$#F]' file
或qx()
更具可读性:
perl -F'/' -ne '$F[2]=qx(date "+%H:M:S"); print @F[2..$#F]' file
此外,如果您想传递参数,您也可以这样做:
perl -F'/' -ne '$F[2]=qx(echo -n $F[2]/); print @F[2..$#F]' file
最终替换只需在-i.bak
之前使用-F
。它将创建一个备份文件,如file.bak
,并修改您原来的文件。
答案 2 :(得分:-1)
#!/bin/bash
OUTFILE03=tmpfile
while IFS=/ read first second fid remainder
do
REAL=`/bin/lfs fid2path /scratch $fid`
echo "$REAL/$remainder"
done <"input.70" >$OUTFILE03