使用系统命令的结果替换文本文件中的字段

时间:2018-02-08 20:58:59

标签: bash awk sed

使用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

3 个答案:

答案 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
  • 然后我们根据您所需的shell调用创建一个命令cmd变量,并将第三个字段$3作为参数。
  • 我们执行cmd shell命令并将其输出传递到内置命令getline并将其放入变量path
  • 调用close()函数在产生输出后关闭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