如何在管道的第n和第n + 1次出现之间获得子串' |'在shell脚本中

时间:2017-11-17 07:34:40

标签: linux bash shell unix sed

我有一个大型文本文件(2000万条记录),所有行都采用以下格式

task|action||r1_c1|r1_c2|r1_c3
task|action||r2_c1|r2_c2|r2_c3
task|action||r3_c1|r3_c2|r3_c3
task|action||r4_c1|r4_c2|r4_c3

我的要求是从第n行打印第2列,其中n是我的输入。列号是固定的,但行号将根据输入而改变。

输入参数(行号)为3时的预期输出 -

r3_c2

我可以逐行读取文件并读取变量

中的第n行
LineOfInterest=$(awk 'NR == n' n=$line $InputFile)

接下来我需要在第4次和第5次管道之间打印值。

我相信可以使用sed来实现,但现在可以确定如何编写相同的模式。

3 个答案:

答案 0 :(得分:1)

您可以使用以下命令:

Line=3;
awk -v n="$Line" -F'|' 'NR == n {print $5;exit;}' file  

enter image description here

这将按要求生成:

r3_c2

如果我传递3作为输入

答案 1 :(得分:1)

既然你已经提到过Input_file中有数百万行,那么一旦命令符合条件(读取具体提到的行),最好不要读取完整的Input_file,我们可以节省一些时间。

cast(unix_timestamp('08.06.2017/10:20:46', "dd.MM.yyyy/HH:mm:ss") as timestamp)

awk -v line=3 -F"|" 'FNR==line{print $(NF-1);exit}' Input_file 表示Input_file中第二行的第二列,您可以根据需要更改它。同样$(NF-1)将确保一旦满足此条件,它应该来自命令,我们可以通过不读取大量的Input_file来节省一些周期。

答案 2 :(得分:0)

你要求sed所以你可以尝试

n=3;sed -n "$n"'s/\([^|]*|\)\{4\}\([^|]*\).*/\2/p' infile