【问题标题】:print lines with specific condition on the last field of each line into another file在每行的最后一个字段中将具有特定条件的行打印到另一个文件中
【发布时间】:2021-08-15 22:02:07
【问题描述】:

我有多个文件,其中一个文件有 4 行,如下所示

2345,abdgdhf,......,12879
6354, kfsjgdh,.....,"fac
74573,khskdd,......,5663
gffhf,gfgfhfh,......,7675

我想将第一个字段不是数字的行或最后一个字段的第一个字符引用到另一个文件中。预期的输出应该是一个包含如下两行的文件

6354, kfsjgdh,.....,"fac
gffhf,gfgfhfh,......,7675

下面的命令将打印第一个字段不是数字的行

for f in *.csv; do 
    awk -F "," '(/^[^0-9]/) {print }' "$f" > ./bad/"$f"
done

输出将是

gffhf,gfgfhfh,......,7675

下面的命令会给我最后一个字段的第一个字符 awk -F "," '{print ($(NF))}' <file> |sed 's/\(.\{1\}\).*/\1/' 输出将是

1
"
5
7

我不知道如何将此行合并到我的 for 循环中,并添加一个条件以仅抓取带有引号的行作为最后一个字段的第一个字符,以便在预期输出中具有第一行 6354, kfsjgdh,.....,"fac

【问题讨论】:

    标签: linux loops awk sed


    【解决方案1】:

    你不需要 for 循环:

    awk -F',' '
        FNR==1 { close(out); out="./bad/" FILENAME }
        ($1 !~ /^[0-9]+$/) || ($NF ~ /^"/) { print > out }
    ' *.csv
    

    【讨论】:

    • 谢谢。我有多个文件,想对所有人都做同样的事情。我编辑了我的问题
    • 是的,我明白这一点,正如我所提到的,您不需要循环来执行此操作。完全运行我发布的命令,它将同时适用于您的所有文件。
    • @user3854325 如果这符合您的要求,那么请参阅stackoverflow.com/help/someone-answers 了解下一步该做什么。如果没有,请随时告诉我们失败的原因并提出问题。
    猜你喜欢
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2022-11-29
    • 2011-08-14
    相关资源
    最近更新 更多