Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 将所有行打印在“中”;文件2“;其行号存储在;文件1“$2._Shell_Unix_Awk_Gawk - Fatal编程技术网

Shell 将所有行打印在“中”;文件2“;其行号存储在;文件1“$2.

Shell 将所有行打印在“中”;文件2“;其行号存储在;文件1“$2.,shell,unix,awk,gawk,Shell,Unix,Awk,Gawk,文件1: 文件2: count line_num xy 55 ab 67 我想打印55行,67行的文件2 我正在努力: a|b|c d|e|f #/usr/bin/ksh 读取文件名时;做 第_num行=`echo$file_name | awk'{print$2}` awk'NR==$line_num{print;exit}'file2>>file3.txt 完成1忽略第一行作为标题,但因为它不包含数字,所以不需要)。一旦第一个文件加载到ma

文件1:

文件2:

count    line_num  
xy       55  
ab       67 
我想打印55行,67行的文件2

我正在努力:

a|b|c  
d|e|f  
#/usr/bin/ksh
读取文件名时;做
第_num行=`echo$file_name | awk'{print$2}`
awk'NR==$line_num{print;exit}'file2>>file3.txt
完成<文件1

但它不起作用

使用
awk
您可以执行以下操作:

#!/usr/bin/ksh  
while read file_name; do  
    line_num=`echo $file_name | awk '{print $2}'`  
    awk 'NR==$line_num{print;exit}' file2 >> file3.txt  
done < file1  

我们迭代第一个文件,并将第二列存储在一个名为
line
的映射中(我们可以通过执行
NR>1
忽略第一行作为标题,但因为它不包含数字,所以不需要)。一旦第一个文件加载到map中,我们迭代第二个文件并打印出map中的行
NR
FNR
是记忆行号的awk变量

使用
awk
您可以执行以下操作:

#!/usr/bin/ksh  
while read file_name; do  
    line_num=`echo $file_name | awk '{print $2}'`  
    awk 'NR==$line_num{print;exit}' file2 >> file3.txt  
done < file1  

我们迭代第一个文件,并将第二列存储在一个名为
line
的映射中(我们可以通过执行
NR>1
忽略第一行作为标题,但因为它不包含数字,所以不需要)。一旦第一个文件加载到map中,我们迭代第二个文件并打印出map中的行
NR
FNR
是记忆行号的awk变量

您可以使用
awk
读取循环中的行号,并使用
sed
打印特定行:


在读取一个文件时;do sed-n${a}p f2.txt;完成<您可以使用
awk
读取循环中的行号,并使用
sed
打印特定行:


在读取一个文件时;do sed-n${a}p f2.txt;完成<使用sed构建一个sed一行程序(对于文件1,它将输出并运行
sed-n“55p;67p;“文件2
):


唉,这是awk的好广告

使用sed构建一个sed一行程序(对于文件1,它将输出并运行
sed-n“55p;67p;“文件2
):


唉,这是awk的好广告

确保你先阅读。是的,如果它是一个中等大小的文件,它会比普通的
awk
慢很多。好吧,既然它甚至比awk脚本更简短,为什么还要这样做呢。顺便说一句,千万不要将字母
l
用作变量名,因为它看起来太像数字
1
(在某些字体中无法区分),因此会混淆代码。从逻辑上讲,如果有人不知道
awk
,它会更容易解释,shell必须提供的许多东西是
awk
所没有的。我强烈不同意shell循环比惯用的awk解决方案更容易理解(请参阅),但我想是YMMV。在任何情况下,如果有人正在做这样的任务,但不知道awk,那么他们需要学习如何在awk中完成任务,因为这是正确的方法。当然,shell可以做很多awk做不到的事情,但是发明shell来做这些事情的人也发明了awk,以便shell在需要处理文本时调用。在UNIX中,您只需为每个作业使用正确的工具,仅此而已。请确保您先阅读。是的,如果它是一个中等大小的文件,它将比普通的
awk
慢得多。对,既然它甚至比awk脚本更简短,为什么还要这样做呢。顺便说一句,千万不要将字母
l
用作变量名,因为它看起来太像数字
1
(在某些字体中无法区分),因此会混淆代码。从逻辑上讲,如果有人不知道
awk
,它会更容易解释,shell必须提供的许多东西是
awk
所没有的。我强烈不同意shell循环比惯用的awk解决方案更容易理解(请参阅),但我想是YMMV。在任何情况下,如果有人正在做这样的任务,但不知道awk,那么他们需要学习如何在awk中完成任务,因为这是正确的方法。当然,shell可以做很多awk做不到的事情,但是发明shell来做这些事情的人也发明了awk,以便shell在需要处理文本时调用。在UNIX中,您只需为每个作业使用正确的工具,仅此而已。
sed -n "$(sed -n '2~1{s/.* //;s/.*/&p/p}' file1)" file2