gpt4 book ai didi

Unix - 需要剪切具有多个空格作为分隔符的文件 - awk 还是 cut?

转载 作者:行者123 更新时间:2023-12-04 02:32:22 26 4
gpt4 key购买 nike

我需要从 Unix 中的文本文件中获取记录。分隔符是多个空格。例如:

2U2133   1239  
1290fsdsf 3234

从中,我需要提取
1239  
3234

所有记录的分隔符始终为 3 个空格。

我需要在 unix 脚本 (.scr) 中执行此操作并将输出写入另一个文件或将其用作 do-while 循环的输入。我尝试了以下方法:
while read readline  
do
read_int=`echo "$readline"`
cnt_exc=`grep "$read_int" ${Directory path}/file1.txt| wc -l`
if [ $cnt_exc -gt 0 ]
then
int_1=0
else
int_2=0
fi
done < awk -F' ' '{ print $2 }' ${Directoty path}/test_file.txt

test_file.txt 是输入文件,file1.txt 是查找文件。但是上面的方法不起作用,并且在 awk -F 附近给了我语法错误

我尝试将输出写入文件。以下在命令行中工作:
more test_file.txt | awk -F'   ' '{ print $2 }' > output.txt

这是有效的并将记录写入命令行中的 output.txt。但同样的命令在 unix 脚本中不起作用(它是一个 .scr 文件)

请让我知道我哪里出错了以及如何解决这个问题。

谢谢,
维萨赫

最佳答案

这取决于 cut 的版本或实现在你的机器上。某些版本支持一个选项,通常是 -i ,这意味着“忽略空白字段”,或者等效地,允许字段之间有多个分隔符。如果支持,请使用:

cut -i -d' ' -f 2 data.file

如果不是(而且它不是普遍的——甚至可能不是普遍的,因为 GNU 和 MacOS X 都没有这个选项),那么使用 awk更好,更便携。

您需要管道输出 awk进入你的循环,虽然:
awk -F' ' '{print $2}' ${Directory_path}/test_file.txt |
while read readline
do
read_int=`echo "$readline"`
cnt_exc=`grep "$read_int" ${Directory_path}/file1.txt| wc -l`
if [ $cnt_exc -gt 0 ]
then int_1=0
else int_2=0
fi
done

唯一的遗留问题是 while loop 位于子 shell 中,因此不会修改您的主 shell 脚本变量,而只是修改这些变量的副本。

使用 bash,您可以使用 process substitution :
while read readline  
do
read_int=`echo "$readline"`
cnt_exc=`grep "$read_int" ${Directory_path}/file1.txt| wc -l`
if [ $cnt_exc -gt 0 ]
then int_1=0
else int_2=0
fi
done < <(awk -F' ' '{print $2}' ${Directory_path}/test_file.txt)

这留下了 while在当前 shell 中循环,但安排命令的输出看起来好像来自文件。
${Directory path}中的空白通常是不合法的——除非它是我错过的另一个 Bash 功能;您在一个地方也有一个错字 ( Directoty )。

关于Unix - 需要剪切具有多个空格作为分隔符的文件 - awk 还是 cut?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4367304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com