我正在研究机器人框架测试用例。我的要求是阅读下面的文件并根据位置比较值。例如:
- 以 3 开头的行。3 是 ID 号,我必须选择整行,并根据位置比较值。BRONYX 从第 9 个位置开始,应该与第 44 个位置 NEW YORK 的输出进行比较。在此示例中,BRONYX 应更改为 NEWYORK。如何根据位置提取字符串。
3^G^G^G^GBRONX^GNY^G10457^GUSA^G^G^GBRONX 应更改为 NEW YORK - 派生城市示例^G^G^G^GNEW YORK^GNY^G10457^G10457^G^GBRONX 县^G^GBRONX^G纽约^GUSA^G^G^G^G^G^G^G^G40.845600^G-73.898500^G325^GSPU^GZ1^G^G^G^G^G^G^ G^纽约-纽瓦克-泽西市,NY-NJ-PA 大都会统计区^G35620^GE020^GZC5X^GMMMMMVVV^G36005039500
示例2:选择 ID 为 2 的行,在此示例中,第 9 位的 MANHATTAN 应更改为 New York(位置为 40)。 2^G^G^G^GMANHATTAN^GNY^G^GUSA^G^G^GMANHATTAN 应更改为 NEW YORK - 派生城市示例^G^G^G^GNEW YORK^GNY^G^G^G^GNEW YORK ^G^G^G^GUSA^G^G^G^G^G^G^G^G40.783434^G-73.966249^G425^GSPU^GG3^G^G^G^G^G^G^G ^G^G^G^G^GMMMMMVVM^G
你能帮忙吗?
答案1
假设每个^G
都是 Control-G 字符,即文件使用 ASCII 响铃字符 ( \a
) 分隔,并且您要将每行的第 5 个字段设置为第 15 个字段的值:
awk -F '\a' 'BEGIN { OFS=FS } { $5 = $15 }; 1' file >newfile
这使用 将字段分隔符设置为 ASCII 响铃字符-F '\a'
。然后,它将输出字段分隔符设置为相同的字符,并继续将第 5 个字段更新为第 15 个字段的值。代码中的尾随1
会导致输出修改后的记录。结果将写入newfile
本示例中称为的文件中。
您是否只影响以第一个字段2
或3
第一个字段开头的行,然后使用
awk -F '\a' 'BEGIN { OFS=FS } $1 == 2 || $1 == 3 { $5 = $15 }; 1' file >newfile
结果格式化为降价表,仅供演示。第4列是e
列,第15列是o
列。
A | 乙 | C | d | e | F | G | H | 我 | j | k | 我 | 米 | n | 哦 | p | q | r | s | t | 你 | v | w | X | y | z | 啊 | BB | 抄送 | DD | 伊 | FF | gg | 呵呵 | 二 | 杰杰 | kk | 二 | 毫米 | 恩 | 哦 | PP | RR | SS | TT | 呃 | 维维 | WW | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3 | 纽约 | 纽约 | 10,457 | 美国 | 布朗克斯应该改为纽约 - 派生城市示例 | 纽约 | 纽约 | 10,457 | 10,457 | 布朗克斯县 | 布朗克斯 | 纽约 | 美国 | 40.846… | -73.898… | 325 | SPU | Z1 | 纽约-纽瓦克-泽西市,纽约-新泽西-宾夕法尼亚大都会统计区 | 35,620 | E020 | ZC5X | MMMMMVVV | 36,005,039,500 | ||||||||||||||||||||||||
2 | 纽约 | 纽约 | 美国 | 曼哈顿应该改为纽约 - 派生城市示例 | 纽约 | 纽约 | 纽约 | 美国 | 40.783… | -73.966… | 第425章 | SPU | G3 | MMMMMVVM |
答案2
欢迎来到SE。一些想法:
- 通过管道传输文件
hexdump
或xxd
查看可读表示。 - 用于
strings
从文件中提取可读文本。我想这个可能对你有帮助。 - 使用
cut
和/或head
加号tail
分别提取部分行或选择行。sed
或者awk
也可以成为你的朋友,但前提是你学会使用它们。这需要数年时间。
如何根据位置提取字符串
基于这个问题很难说。
应该与输出进行比较
您要求我们写出您的解决方案吗?你尝试了什么。您man awk
按照建议阅读了吗?或者 Linux 没有提供印地语文档吗?
例子
如果字符串是固定长度的,并且如果该文件没有换行符,那么也许您可以使用一次cut
调用:
$ echo my long string | cut -c4-8
输出:
long
注意。请使用编辑器或 Markdown 格式来更好地显示您的数据。
答案3
首先,我找到并将所有 Ctrl+G 字符替换为|
(管道)使用
sed 's/^G/|/g' test.csv > output.csv
我能够使用打印整行
grep ^6 output.csv
是6
身份证号码。
6|LAKELINE MALL|||AUSTIN|TX||USA|||MALL EXAMPLE - POI|11066 PECAN PARK BLVD|||AUSTIN|TX|78613|78613||TRAVIS||AUSTIN|CEDAR PARK|USA||||||||30.468408|-97.803570|140|SPU|NA||||||||||||UUUUUVVM|