【问题标题】:Matching fields across multiple files跨多个文件匹配字段
【发布时间】:2013-08-24 22:59:59
【问题描述】:

我有两个文件:file1 和 file2 如下:

文件 1 文件 2 橙汁 orangejuice_9.88_9.88 菠萝汁appleslices_6.3_2.2 苹果片菠萝汁_1.2_3.9 芒果汁 Mangojuice_5.55_5.55

输出应该是:

橙汁_988 菠萝汁_120_390 appleslices_630_220 芒果汁_555

从file1逐行读取时,在file2中查找file1所在行的pattern,找到后比较file2的第2和第3个字段,如果相同则打印一次,否则打印两个数字.(这个数字无论如何都应该乘以100)

我想到了这个:

while read -r -u 3 line1
do
nawk ' "$line1" print $0}' file2.txt
if "$2" == "$3"
then echo "scale=2;$2*100" |bc
else echo "$2_$3"
fi
done 3<file1.txt

所以,我想知道逻辑是否正确,并修正我的乘法,它会得到 988 而不是 988.0。

【问题讨论】:

    标签: bash awk solaris nawk


    【解决方案1】:

    GNU awk 的一种方式:

    $ awk 'NR==FNR{a[$0];next}($1 in a){print $1,$2==$3?$2*100:$2*100OFS$3*100}' FS=_ OFS=_ file1 file2
    orangejuice_988
    appleslices_630_220
    pineapplejuice_120_390
    Mangojuice_555
    

    【讨论】:

    • 不,上面的代码与您的输入和GNU awk 完美配合。要么您没有使用GNU awk,即您有一台 Mac,或者您的问题不代表您的实际数据。 the above code is giving error 对我来说完全没用,什么错误?你有什么版本或awk?你在运行什么系统?
    • 我有solaris,所以我正在使用nawk
    • @user2613272 只需使用 /usr/xpg4/bin/awk 代替。
    • 顺便说一句 ($1 in a ) 代表什么?正是一个
    • $1(file2 中当前记录中的第一个字段)在从第一个文件构建的查找数组中找到,即是在 file1 中找到的 file2 中的第一个单词。如果仅此而已,请通过单击旁边的勾号来接受此答案,以表明您的问题已解决。
    【解决方案2】:

    你的逻辑更容易用 Awk 来表达。假设file1 的作用是将file2 中的数据限制为仅一些记录(您的示例似乎没有证明这一点),请尝试这样的操作。

    awk -F _ '# Make OFS equal to FS
        BEGIN { OFS=FS }
        # Read file1 into a[]
        NR==FNR { a[$0]++; next }
        # If we fall through to here, we are in file2
        # On any lines where $1 is in a[]
        a[$1] {
            if ($2==$3) print $1, $2*100;
            else print $1, $2*100, $3*100;
        }' file1 file2
    

    【讨论】:

    • 我还有一个问题,我可以在哪里存储我通常使用的输出 >> file3.txt 但我可以把它放在哪里?
    • 上面的代码在运行脚本时没有给我任何输出
    • 为我工作(以 OFS 为模;现在已修复);您的文件中是否有不可见的空格和/或异常的行尾?
    • 我的文件中没有任何空格
    • 当我运行脚本时,还没有出现错误,仍然没有显示输出。你能想到任何理由吗?我尝试了 echo 而不是 print 它给出了一个错误。请注意,我在 solaris 上使用 bash
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多