linux 如何同时显示两个文件中的第n行(在shell脚本中使用'while'循环)?

qjp7pelc  于 2023-06-05  发布在  Linux
关注(0)|答案(3)|浏览(154)

我有两个文件'name.txt'和'extensionv2.txt',他们都在同一个文件夹.
两者具有相似的行数。
我想同时从两个文件中获取 * 第n行 *(变量行)到命名的ex1nm变量中。
所以我创建了一个 while 循环。
一切正常,但我无法使用sed获得第n行。
如何使用shell脚本实现此操作?
下面是我的.sh文件:

m=$(wc -l name.txt)
echo "m = $m"
t5="name.txt"
j=${m//$t5/}
echo "j = $j"
k=1
while [ $j -ge $k ]
do
    echo $j
    ex1=$(sed -n "$j{p;m}" extensionv2.txt)  # Print a variable line in file
    nm=$(sed -n "$j{p;m}" name.txt)
    echo "ex1 = $ex1"
    echo "nm = $nm"
    #v=echo "'$nm.$ex1'"
    j=$(($j-1))
done

我试过了,但我不知道怎么把它写进我的代码里...

input="name.txt"
while IFS= read -r line
do
    echo "$line"
done < "$input"
6jjcrrmo

6jjcrrmo1#

awk

LineNum=2
awk -v LineNum=$LineNum 'FNR==LineNum' file1 file2

要将输出保存在变量中,请执行以下操作:

var=$(awk -v LineNum=$LineNum 'FNR==LineNum' file1)
2o7dmzc5

2o7dmzc52#

听起来你可能正在寻找类似以下的东西(未经测试,并使用GNU awk for ENDFILEnextfile and "/dev/stderr"):

#!/usr/bin/env bash

readarray -d $'\n' -t vals < <(
    awk -v n=7 '
        FNR == n {
            print
            nextfile
        }
        ENDFILE {
            if ( FNR < n ) {
                printf "File \"%s\" too short: %d\n", FILENAME, FNR > "/dev/stderr"
                exit 1
            }
        }
    ' 'name.txt' 'extensionv2.txt'
)
(( $? == 0 )) || exit
nm="${vals[0]}"
ex1="${vals[1]}"

如果文件的行数少于-v n=中指定的目标行数,上面的代码将向stderr打印一条错误消息,并以失败状态退出。

vaj7vani

vaj7vani3#

我能想到的最快的方法是使用nextfile来加快速度,并将FS设置为\n,这样就不会浪费时间拆分不需要的字段。

mawk2 -v __='5899997' '  BEGIN  { __ += FS = ORS }
                       __ < FNR { nextfile } __ == FNR' file1 file2 …

相关问题