* [FR] ob-awk.el specifying a delimeter argument in for output
@ 2023-03-05 9:50 Jeremie Juste
2023-03-05 12:37 ` Ihor Radchenko
2023-03-06 10:00 ` Max Nikulin
0 siblings, 2 replies; 5+ messages in thread
From: Jeremie Juste @ 2023-03-05 9:50 UTC (permalink / raw)
To: emacs-orgmode; +Cc: tyler
Hello,
ob-awk has proven very valuable to me lately so many
thanks for maintaining it.
First of all let me specify that I'm a beginner user of awk and I don't
know if I'm using ob-awk as it is intended, so I'll be glad for any
suggestions. Let me explain further:
* Default behavior
If I have a csv file with comma separated values, I get the output as an
org table.
;; test.csv
123,0,123
#+begin_src awk :in-file test.csv :cmd-line -F ","
{print $0}
#+end_src
#+RESULTS:
| 123 | 0 | 123 |
* Request
However If I have a csv file with say semi column delimited values (;)
I don't get the org table as output
#+begin_src awk :in-file test1.csv :cmd-line -F ";"
{print $0}
#+end_src
#+RESULTS:
: 123;0;123
In my opinion, this could be fixed if we could read the :cmd-line
parameter -F and use the delimeter argument ; as a parameter to the
following function
modified lisp/ob-awk.el
@@ -93,7 +93,7 @@ This function is called by `org-babel-execute-src-block'."
results
(let ((tmp (org-babel-temp-file "awk-results-")))
(with-temp-file tmp (insert results))
- (org-babel-import-elisp-from-file tmp)))))
+ (org-babel-import-elisp-from-file tmp ";")))))
Would this be the right way to do think about this issue?
Best regards,
Jeremie
PS Note that we have a samilar issue in ob-shell
where the delimiter is by default a comma.
#+begin_src shell
echo '192;168;1;200' | awk -F ";" '{print $0}'
#+end_src
#+RESULTS:
: 192;168;1;200
#+begin_src shell
echo '192,168,1,200' | awk -F "," '{print $0}'
#+end_src
#+RESULTS:
| 192 | 168 | 1 | 200 |
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FR] ob-awk.el specifying a delimeter argument in for output
2023-03-05 9:50 [FR] ob-awk.el specifying a delimeter argument in for output Jeremie Juste
@ 2023-03-05 12:37 ` Ihor Radchenko
2023-03-06 7:36 ` Jeremie Juste
2023-03-06 10:00 ` Max Nikulin
1 sibling, 1 reply; 5+ messages in thread
From: Ihor Radchenko @ 2023-03-05 12:37 UTC (permalink / raw)
To: Jeremie Juste; +Cc: emacs-orgmode, tyler
Jeremie Juste <jeremiejuste@gmail.com> writes:
> * Request
>
> However If I have a csv file with say semi column delimited values (;)
> I don't get the org table as output
>
> #+begin_src awk :in-file test1.csv :cmd-line -F ";"
> {print $0}
> #+end_src
>
> #+RESULTS:
> : 123;0;123
> In my opinion, this could be fixed if we could read the :cmd-line
> parameter -F and use the delimeter argument ; as a parameter to the
> following function
Org knows nothing about your output, by default.
You could as well do something like {print $1+-+$2+-+$3}
What should Org do in such case?
Currently, Org tries to guess the type of arbitrary output. If the
output looks like a table, with fields separated by tabs, commas, or
spaces, it converts the output to table. Otherwise, it is treated as
string.
I guess we might add an option to tell Org which separator to use when
parsing output when :results table header argument is provided (see 16.6
Results of Evaluation section of Org manual). However, you can achieve
the same now, using :post header argument, replacing the separators with
something Org can understand.
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FR] ob-awk.el specifying a delimeter argument in for output
2023-03-05 12:37 ` Ihor Radchenko
@ 2023-03-06 7:36 ` Jeremie Juste
2023-03-06 7:47 ` Jeremie Juste
0 siblings, 1 reply; 5+ messages in thread
From: Jeremie Juste @ 2023-03-06 7:36 UTC (permalink / raw)
To: Ihor Radchenko; +Cc: emacs-orgmode, tyler
Hello Ihor,
> Org knows nothing about your output, by default.
> You could as well do something like {print $1+-+$2+-+$3}
> What should Org do in such case?
>
> Currently, Org tries to guess the type of arbitrary output. If the
> output looks like a table, with fields separated by tabs, commas, or
> spaces, it converts the output to table. Otherwise, it is treated as
> string.
Many thanks for the insights. Ok, I guess this it likely to take some
time, but it would be a great feature in my option.
>
> I guess we might add an option to tell Org which separator to use when
> parsing output when :results table header argument is provided (see 16.6
> Results of Evaluation section of Org manual). However, you can achieve
> the same now, using :post header argument, replacing the separators with
> something Org can understand.
Thanks for the suggestion. I tried using post replacing semi columns by
commas but was surprised by the output.
# file test.csv
# 123;0;123
#+NAME: specific-delim
#+BEGIN_SRC emacs-lisp :var tbl=""
(replace-regexp-in-string ";" "," tbl)
#+end_src
#+RESULTS: specific-delim
#+begin_src awk :in-file test.csv :cmd-line -F ";" :post specific-delim(*this*)
{print $0}
#+end_src
#+RESULTS:
: 123,0,123
After a short investigation, I notice that the function
org-babel-import-elisp-from-file, is the function making the call wheter
the result should be a table or not i.e before the :post argument. Have
I understood correctly?
If it is the case, then I would have to not just replace the delimeter
but convert the entire results to an org-table.
Best regards,
Jeremie
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FR] ob-awk.el specifying a delimeter argument in for output
2023-03-06 7:36 ` Jeremie Juste
@ 2023-03-06 7:47 ` Jeremie Juste
0 siblings, 0 replies; 5+ messages in thread
From: Jeremie Juste @ 2023-03-06 7:47 UTC (permalink / raw)
To: Ihor Radchenko; +Cc: emacs-orgmode, tyler
Hello Ihor,
>> I guess we might add an option to tell Org which separator to use when
>> parsing output when :results table header argument is provided (see 16.6
>> Results of Evaluation section of Org manual). However, you can achieve
>> the same now, using :post header argument, replacing the separators with
>> something Org can understand.
Thanks again for the suggestion, after giving your solution more thoughts, I could
achieve the desired output.
# file test.csv
# 123;0;123
#+NAME: specific-delim
#+BEGIN_SRC emacs-lisp :var tbl="" delim=";"
(format "|%s" (replace-regexp-in-string delim "|" tbl))
#+end_src
#+RESULTS: specific-delim
: |
#+begin_src awk :in-file test.csv :cmd-line -F ";" :post specific-delim(*this*,";") :results raw
{print $0}
#+end_src
#+RESULTS:
| 123 | 0 | 123 |
Best regards,
Jeremie
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FR] ob-awk.el specifying a delimeter argument in for output
2023-03-05 9:50 [FR] ob-awk.el specifying a delimeter argument in for output Jeremie Juste
2023-03-05 12:37 ` Ihor Radchenko
@ 2023-03-06 10:00 ` Max Nikulin
1 sibling, 0 replies; 5+ messages in thread
From: Max Nikulin @ 2023-03-06 10:00 UTC (permalink / raw)
To: Jeremie Juste, emacs-orgmode
On 05/03/2023 16:50, Jeremie Juste wrote:
> #+begin_src awk :in-file test.csv :cmd-line -F ","
> {print $0}
> #+end_src
Notice that awk has Output Field Separator that is space by default and
may be set using -v OFS=; (or --assign) command line options. -F option
sets input field separator FS variable.
"print $0" just sends input record to output literally. If you try to
modify some field then record is rebuilt taken into account OFS
echo 1,2 | awk -F , '{ $1=$1+10; print; }'
11 2
See (info "(awk) Changing Fields)")
https://www.gnu.org/software/gawk/manual/gawk.html#Changing-Fields
I just have found this link on stackoverflow. It is enough to add even
$1=$1 that should not really modify field values.
So I expect less issues with a more realistic example.
As to ";" as CSV values separator, it often appears with "," as decimal
separator 1234,56 and dd.mm.yyyy date formats. Unfortunately handling of
localized data formats is not a strong side of Emacs. E.g. fixed
LC_NUMERIC=C forces "." as decimal separator, date parsing functions are
rather limited.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-03-06 10:01 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-05 9:50 [FR] ob-awk.el specifying a delimeter argument in for output Jeremie Juste
2023-03-05 12:37 ` Ihor Radchenko
2023-03-06 7:36 ` Jeremie Juste
2023-03-06 7:47 ` Jeremie Juste
2023-03-06 10:00 ` Max Nikulin
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).